Python, ако __name__ == __main__ Обяснено с примери за кодове

Когато интерпретатор на Python чете файл на Python, той първо задава няколко специални променливи. След това изпълнява кода от файла.

Извиква се една от тези променливи __name__.

Ако следвате тази статия стъпка по стъпка и прочетете нейните кодови фрагменти, ще научите как да използвате if __name__ == "__main__"и защо е толкова важно.

Обяснени модули на Python

Файловете на Python се наричат ​​модули и те се идентифицират чрез .pyразширението на файла. Модулът може да дефинира функции, класове и променливи.

Така че, когато интерпретаторът изпълнява модул, __name__променливата ще бъде настроена така,   __main__сякаш модулът, който се изпълнява, е основната програма.

Но ако кодът импортира модула от друг модул, тогава __name__  променливата ще бъде зададена на името на този модул.

Нека да разгледаме един пример. Създайте модул на Python с име file_one.pyи поставете този код от най-високо ниво вътре:

# Python file one module print("File one __name__ is set to: {}" .format(__name__))

Като стартирате този файл, ще видите точно за какво говорихме. Променливата __name__за този модул е ​​настроена на __main__:

File one __name__ is set to: __main__

Сега добавете друг файл с име file_two.pyи поставете този код вътре:

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) 

Също така променете кода по file_one.pyтози начин, за да импортираме file_twoмодула:

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) 

Пускането на нашия file_oneкод за пореден път ще покаже, че __name__променливата в file_oneне се е променила и все още остава настроена на __main__. Но сега променливата __name__в file_twoе зададена като нейно име на модул, следователно file_two.

Резултатът трябва да изглежда така:

File two __name__ is set to: file_two File one __name__ is set to: __main__ 

Но стартирайте file_twoдиректно и ще видите, че името му е настроено на __main__:

File two __name__ is set to: __main__ 

Променливата __name__за файла / модула, който се изпълнява, ще бъде винаги __main__. Но __name__променливата за всички други модули, които се импортират, ще бъде зададена на името на техния модул.

Конвенции за именуване на файлове на Python

Обичайният начин на използване __name__и __main__изглежда така:

if __name__ == "__main__": Do something here 

Нека да видим как това работи в реалния живот и как всъщност да използваме тези променливи.

Модифицирайте file_oneи file_twoизглеждайте така:

file_one:

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) if __name__ == "__main__": print("File one executed when ran directly") else: print("File one executed when imported") 

file_two:

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) if __name__ == "__main__": print("File two executed when ran directly") else: print("File two executed when imported") 

Отново, когато стартирате file_one, ще видите, че програмата е разпознала кой от тези два модула е __main__и е изпълнила кода според първите ни if elseтвърдения.

Резултатът трябва да изглежда така:

File two __name__ is set to: file_two File two executed when imported File one __name__ is set to: __main__ File one executed when ran directly 

Сега изпълнете file_twoи ще видите, че __name__променливата е настроена на __main__:

File two __name__ is set to: __main__ File two executed when ran directly 

Когато модули като този се импортират и изпълняват, техните функции ще бъдат импортирани и кодът от най-високо ниво ще бъде изпълнен.

За да видите този процес в действие, променете файловете си така, че да изглеждат така:

file_one:

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) def function_one(): print("Function one is executed") def function_two(): print("Function two is executed") if __name__ == "__main__": print("File one executed when ran directly") else: print("File one executed when imported") 

file_two:

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) def function_three(): print("Function three is executed") if __name__ == "__main__": print("File two executed when ran directly") else: print("File two executed when imported") 

Сега функциите са заредени, но не се изпълняват.

За да стартирате една от тези функции, променете if __name__ == "__main__"частта, за file_oneда изглежда така:

if __name__ == "__main__": print("File one executed when ran directly") function_two() else: print("File one executed when imported") 

Когато бягате, file_oneтрябва да видите така:

File two __name__ is set to: file_two File two executed when imported File one __name__ is set to: __main__ File one executed when ran directly Function two is executed 

Също така можете да стартирате функции от импортирани файлове. За да направите това, променете if __name__ == “__main__”частта, за file_oneда изглежда така:

if __name__ == "__main__": print("File one executed when ran directly") function_two() file_two.function_three() else: print("File one executed when imported") 

И можете да очаквате резултат като този:

File two __name__ is set to: file_two File two executed when imported File one __name__ is set to: __main__ File one executed when ran directly Function two is executed Function three is executed 

Сега да кажем, че file_twoмодулът е наистина голям с много функции (две в нашия случай) и вие не искате да импортирате всички от тях. Променете, за file_twoда изглежда така:

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) def function_three(): print("Function three is executed") def function_four(): print("Function four is executed") if __name__ == "__main__": print("File two executed when ran directly") else: print("File two executed when imported") 

И за да импортирате специфичните функции от модула, използвайте fromблока за импортиране във file_oneфайла:

# Python module to execute from file_two import function_three print("File one __name__ is set to: {}" .format(__name__)) def function_one(): print("Function one is executed") def function_two(): print("Function two is executed") if __name__ == "__main__": print("File one executed when ran directly") function_two() function_three() else: print("File one executed when imported")

Заключение

Има наистина хубав случай на използване на __name__променливата, независимо дали искате файл, който може да се изпълнява като основна програма или да се импортира от други модули. Можем да използваме if __name__ == "__main__"блок, за да разрешим или предотвратим стартирането на части от кода при импортиране на модулите.

Когато интерпретаторът на Python чете файл, __name__променливата се задава така, __main__сякаш модулът се изпълнява, или като име на модула, ако е импортиран. Четенето на файла изпълнява целия код от най-високо ниво, но не и функции и класове (тъй като те ще се импортират само).

Сутиен gjort! (Това на шведски означава „Браво“!)

Вижте още статии като тази в моя профил в freeCodeCamp, среден профил и други забавни неща, които изграждам на страницата си в GitHub.