Вы видите это везде.
Если вы некоторое время программировали на Python или просто просматривали репозитории Python Github, вы, вероятно, натолкнулись на этот фрагмент кода.
if __name__ == '__main__': # do something
Он вездесущий.
Фактически, именно столько раз этот фрагмент кода появляется в Github!
18 миллионов + раз!
Итак, без дальнейших церемоний, давайте изучим, что именно делает этот фрагмент кода.
__name__ – это просто встроенная переменная в Python, которая оценивает имя текущего модуля.
Чтобы полностью понять, что такое __name__ и как оно используется, давайте рассмотрим ряд примеров.
Давайте создадим простой скрипт Python в файле с именем test.py
# test.py print("__name__ в test.py имеет значение " + __name__)
Эта строка будет выводить переменную __name__ на экране, чтобы мы могли ее изучить.
Давайте запустим этот скрипт из терминала и посмотрим, что мы получим.
$ python test.py
Вот вывод, который вы увидите на экране.
$ python3 test.py __name__ в test.py имеет значение __main__
Из этого можно сделать вывод, что в этом примере переменной __name__ было присвоено строковое значение __main__
Теперь давайте посмотрим на немного другой пример.
Давайте создадим новый файл test2.py в том же каталоге, что и test.py
В этом новом файле давайте импортируем test, чтобы мы могли проверить переменную __name__ в test.py, а также напечатаем переменную __name__ в test2.py
# test2.py import test print("__name__ in test2.py имеет значение " + __name__)
Если вы запустите скрипт test2.py из терминала, это то, что вы увидите на своем экране.
$ python3 test2.py __name__ in test.py имеет значение test __name__ in test2.py имеет значение __main__
Хм, интересно, так что же происходит?
По сути, происходит то, что __name__ устанавливается на уровне модуля.
Устанавливается на имя модуля. Другими словами, для каждого модуля в вашем коде, __name__ будет установлен на это имя модуля.
А для точки входа выполнения, основного сценария Python, переменная __name__будет установлена в __main__
Это круто и все, но как эта специальная переменная используется на практике?
Одна из причин этого заключается в том, что если вы хотите написать модуль, который может быть выполнен напрямую или альтернативно, импортируйте его и используйте в другом модуле.
Например, давайте создадим фиктивный модуль hello.py, который другие смогут импортировать в свои собственные сценарии или могут напрямую выполнить его, если захотят.
Вот что должен делать этот модуль.
Если вы выполняете модуль напрямую, он должен напечатать Привет, AndreyEx на экране.
Но если вы вместо этого импортируете его, он может предоставить вам функцию hello(), где вы можете контролировать, кого приветствовать.
# hello.py def hello(name): print(f"Привет, {name}!") if __name__ == '__main__': hello('AndreyEx')
Теперь давайте создадим основной скрипт main.py, который будет импортировать модуль hello.
# main.py from hello import hello hello('Destroyer')
Мы просто получаем Привет, AndreyEx! на экране, так как условие if внутри модуля hello будет выполнено!
$ python3 hello.py Привет, AndreyEx!
Теперь мы получим только Привет, AndreyEx! напечатано на экране.
$ python3 main.py Привет, Destroyer!
Если вы не включили условие if в свой модуль, вы получите этот нежелательный результат при запуске основного скрипта.
$ python3 main.py Привет, AndreyEx! Привет, Destroyer!