2011-11-22 27 views
8

Olası Çoğalt:
What does <if name==“main”:> do?Eğer isim == "__main __" `, Python'da ne anlama gelir?

şimdi uzunca bir süre Python komut dosyalarını yazdım ve bunu ihtiyaç olarak ben Python daha inceliyoruz. Başka insanların kodunu okurken, sık sık if name == "__main__": yapısını karşılıyorum.

Bu ne işe yarar? Temelde

+1

Anlıyorum ... 'eğer __name __ = "__ ana __":' denetler komut bağımsız veya bir modüldür solup. – Adobe

+1

Kopyala-yapıştırıcılar için ve/veya karışıklığı önlemek için, önceki yorumdaki yazım hatalarından haberdar olun: 'Eğer __name __ ==" __ main __ ": – alberto

cevap

20

Bu, aynı dosyayı hem kitaplık (içe aktarma yoluyla) hem de uygulama için başlangıç ​​noktası olarak kullanmanıza olanak tanır.

# hello.py 
def hello(to=__name__): 
    return "hello, %s" % to 

if __name__ == "__main__": 
    print hello("world") 

iki şekilde bu kodu kullanabilirsiniz:

Örneğin, aşağıdaki dosyayı düşünün. Birincisi, onu ithal eden bir program yazabilirsiniz. Eğer kütüphane alırsanız, __name__ kütüphanenin adı olacaktır ve böylece çek başarısız olur ve kod (istenen davranış budur) yürütmek olmaz:

#program.py 
from hello import hello # this won't cause anything to print 
print hello("world") 

yazmak için istemiyorsanız

$ python hello.py 
hello, __main__ 

tüm piton kütüphane ithal veya doğrudan çalıştırılabilir yapıp yapmadığına bağlı biçimde ayarlanır özel değişken __name__ bağlıdır Bu davranış: Bu ikinci dosya, doğrudan gibi bir şeyle komut satırından kodunuzu çalıştırabilir çevirmen. Doğrudan çalıştırılırsa __main__ olarak ayarlanır. İçe aktarılırsa, kitaplık adına ayarlanır (bu durumda, hello).

Genellikle bu yapı, kodunuza birim testleri eklemek için kullanılır. Bu şekilde, bir kütüphane yazdığınızda kütüphaneyi normal bir şekilde kullanması durumunda icra edilmek zorunda kalmadan test kodunu doğrudan dosyaya gömebilirsiniz. Kütüphaneyi test etmek istediğinizde, herhangi bir çerçeveye ihtiyacınız yoktur, çünkü kütüphaneyi bir programmış gibi çalıştırabilirsiniz.

Ayrıca bakınız __main__ in the python documentation (o derece seyrek olsa)

3

,

"ana" komut dosyası ve ithal veya başka bir şekilde başvurulan harici dosyaları arasında bir ayrım var

. Komut dosyası "ana" komut dosyasıysa, __name__ özel değişkeni "__main__"'a eşit olacaktır.

"Yürütme" kodunu komut dosyasında bulunan sınıf ve değişkenlerden korumak için bunu kullanabilirsiniz. Bu, bir betiği içe aktarmanıza ve eğer varsa, o komut dosyasının ana kodunu çalıştırmadan sınıfları ve değişkenleri kullanmanıza olanak tanır.

+0

Bonus-trivia: Bir modülü içe aktarırsanız, __name__ içinde ne bulursunuz? Bu "__main__" olarak adlandırılacak? – Agrajag

İlgili konular