Article cover

11.11.2023

5

Like

1235

Views

if __name__ == '__main__' Nedir?

Python'da if __name__ == '__main__' yapısı, bir Python dosyasının modül olarak mı yoksa ana program olarak mı kullanıldığını kontrol etmek için kullanılır.

Direkt olarak çalıştırdığımızda:

  • Eğer .py uzantılı dosya direkt olarak çalıştırılırsa __name__değeri default olarak __main__ olduğundan dolayı if __name__ == '__main__' yapısının altında bulunan kodlar otomatik olarak çalışacaktır.

Modül olarak içeri aktardığımızda

  • Eğer .py uzantılı dosya import komutu ile içe aktarılırsa modüldeki tüm kodlar çalıştırılmaz, yalnızca tanımlanan sınıflar, fonksiyonlar, değişkenler vb. kullanılabilir hale gelir.


if __name__ == '__main__' Yapısı Olmadan

Bunu daha iyi görmek için aşağıdaki kod parçacığını ele alalım.

Bu kodu direkt olarak çalıştırdığımızda program bize 6 adet unique değer verecektir.

from random import sample
# sample unique degerler uretir

def loto_sayilarini_uret(min_sayi, max_sayi, adet):
return sample(range(min_sayi, max_sayi + 1), adet)

def main():
min_sayi = 1
max_sayi = 49
adet = 6
sayilar = loto_sayilarini_uret(min_sayi, max_sayi, adet)
#sayilar.sort()
print('Lotoyu kazanan sayilar:', sayilar)

main()

# Output
#Lotoyu kazanan sayilar: [3, 46, 4, 38, 49, 16]


Şimdi bu kodu sayisal_loto.py isimli bir Python dosyasına kaydettiğimizi düşünelim.

Şimdi de bu dosyayı içe aktaralım ve ne olduğuna bakalım.

import sayisal_loto

# Output
#Lotoyu kazanan sayilar: [47, 1, 5, 42, 26, 16]


Görüldüğü gibi program import ettiğimiz gibi baştan aşağı tüm kodları çalıştırdı ve ekrana 6 tane unique değer bastı.


if __name__ == '__main__' Yapısı İle

Eğer programa if __name__ == '__main__' yapısını eklersek ne olduğuna bakalım.

from random import sample
# sample unique degerler uretir

def loto_sayilarini_uret(min_sayi, max_sayi, adet):
return sample(range(min_sayi, max_sayi + 1), adet)

def main():
min_sayi = 1
max_sayi = 49
adet = 6
sayilar = loto_sayilarini_uret(min_sayi, max_sayi, adet)
#sayilar.sort()
print('Lotoyu kazanan sayilar:', sayilar)

if __name__ == '__main__':
main()

# Output
#Lotoyu kazanan sayilar: [19, 38, 33, 26, 10, 17]


Bu kodu direkt olarak çalıştırdığımızda __name__ değeri default olarak __main__'e eşit olduğundan dolayı program bize 6 adet unique değer verecektir.

Peki bu kodu sayisal_loto.py isimli dosyadan import edersek ne olacak?

import sayisal_loto


Görüldüğü gibi bu sefer dosyayı import ettiğimizde programın if __name__ == '__main__': yapısı altında bulunan kodlar çalıştırılmadı. Bunun sebebi artık __name__ yapısının değerinin __main__'e eşit olmamasıdır. __name__ yapısının yeni değeri import ettiğimiz dosyanın adı olmuştur. Yani bu senaryoda sayisal_loto __name__ değerine eşit olmuştur.

Şuan sadece dosyadaki fonksiyonlar kullanılabilir hale geldi.

Eğer bunları kullanmak istersek aşağıdaki gibi çağırmamız gerekecek.

import sayisal_loto

loto = sayisal_loto.main()

loto

# Output
#Lotoyu kazanan sayilar: [14, 10, 20, 41, 45, 44]


Bu yapı kullanılarak bir Python dosyasının hem modül olarak hem de aynı dosyanın doğrudan çalıştırıldığında farklı bir işlevi yerine getirmesini sağlayabiliriz.

Avantajları

  • Modül olarak kullanıldığında, dosyanın kodlarının yanlışlıkla çalıştırılması önlenir. Eğer bir dosya bir modül olarak başka bir dosyada kullanılıyorsa, if __name__ == '__main__': bloğu içindeki kodlar çalışmayacaktır. Böylece, modül olarak kullanılan dosyaların yanlışlıkla yan etki oluşturacak kodlar içermesi engellenir.
  • Ana program olarak kullanıldığında, dosyanın test edilmesini sağlar. if __name__ == '__main__': bloğu içindeki kodlar, dosyanın doğrudan çalıştırıldığı zaman çalışacak ek işlemler veya test kodları olarak kullanılabilir. Böylece, dosyanın doğru şekilde çalıştığını test etmek için ayrı bir test dosyası yazmaya gerek kalmaz.

Dezavantajları

  • Kodun karmaşıklığını artırabilir ve bazen gereksiz olabilir.


Beni daha fazla dokümantasyon ve bilgi için aşağıdaki Github hesabımdan takip edebilirsin :)


Enes Fehmi Manan Github


Python Temel
İleri Python
Herkes İçin Temel Dersler

Comments

You need to log in to be able to comment!

Enes Fehmi Manan

Data Scientist/Mentor

Location

İzmir, TR

Education

İstatistik - Ege

© 2021 Patika Dev

facebook
twitter
instagram
youtube
linkedin

Disclaimer: The information /programs / events provided on https://patika.dev and https://risein.com are strictly for upskilling and networking purposes related to the technical infrastructure of blockchain platforms. We do not provide financial or investment advice and do not make any representations regarding the value, profitability, or future price of any blockchain or cryptocurrency. Users are encouraged to conduct their own research and consult with licensed financial professionals before engaging in any investment activities. https://patika.dev and https://risein.com disclaim any responsibility for financial decisions made by users based on information provided here.