10 Kasım 2013 Pazar

Python Modüllerinde __name__ Özelliğinin Kullanımı

Modüller yenilir mi, içilir mi?

Öncelikle python’da modüllerden ufak bi’ bahsedeyim. Bildiğiniz gibi bir betik içersinde kodlarımızı tekrar tekrar yazmamak için bir kez fonksiyon tanımlamamız yeterli. O fonksiyonu kullanarak kodları tekrar kullanabiliyoruz. Peki ya aynı fonksiyona başka bir Python programında da ihtiyacımız olursa ne yapacağız? Cevap tabii ki modül kullanmak.
Python’da modül yazmak için birçok metod var ama bunlardan en basit ve en yaygın olanı fonksiyonlar ve değişkenler için .py uzantılı dosyaları kullanmak. Yani evet, şimdiye kadar yazdığınız her python betiği aynı zamanda birer modül. Diğer bir modül oluşturma yöntemi de C veya C++ programlama dilleri ile yazmaktır.
Yani sonuç olarak python’da modül dediğimiz şey aslında bizim yazdığımız betiklerdir. Yani yazdığımız her python betiği bir modül olarak başka bir betikte içe aktarılabilir(import). Modüller için ayrıca buraya bakabilirsiniz.

Bir modül’ün ismi

Yavaş yavaş asıl değinmek istediğim konuya geleyim. Python’da her modülün bir ismi vardır. Python yorumlayıcısı bir modülü yorumlarken o modüldeki tüm kodları çalıştırmadan önce bazı değişkenler tanımlar. Bunlardan birisi __name__ değişkenidir. Bu değişken, o modül’ün çalıştırılma şekline göre başka değerler alır.
Eğer python yorumlayıcısı bizim yazdığımız modülü ana program olarak çalıştırıyorsa __name__ değişkeni '__main__' değerini alır. Ancak yazmış olduğumuz modül başka bir modül içinden çağırılıyorsa bu sefer __name__ değişkeni kendi modül’ünün adını alır.
Anlaşılması için bunları bir örnekle açıklayayım;
Örneğin ornek_modul.py isminde bir dosyaya kaydedeceğimiz şöyle bir betik yazalım:
__name__ özelliğinin kullanımı
1
2
3
4
if __name__ == '__main__':
    print('Kendi dosyam tarafından çalıştırıldım.')
else:
    print('Başka bir modül tarafından içe aktarılarak çalıştırıldım.')
Şimdi bu betikle ilgili çıktılara bakalım:
çıktı testleri
1
2
3
4
5
6
$ python3 ornek_modul.py
Kendi dosyam tarafından çalıştırıldım.
$ python3
>>> import ornek_modul
Başka bir modül tarafından içe aktarılarak çalıştırıldım.
>>>
Görüldüğü gibi ornek_modul.py doyasını kendi başına çalıştırısak __name__ değişkeni '__main__' değerini alıyor. Fakat python’un etkileşimli kabuğuna girip ornek_modul modülünü içeri aktarırsak 1. koddaki else bloğuna düşeriz çünkü __name__ değişkeni bu defa modülün ismi olan ornek_modul değerini almış olur.

Hiç yorum yok:

Yorum Gönder