Прежде чем что-то объяснять, if __name__ == '__main__'
важно понять, что __name__
и для чего нужно.
Что такое __name__
?
__name__
является DunderAlias - можно рассматривать как глобальную переменную (доступную из модулей) и работает аналогичным образом , к global
.
Это строка (глобальная, как упомянуто выше), обозначенная как type(__name__)
(выходная <class 'str'>
), и это встроенный стандарт для версий как Python 3, так и Python 2 .
Куда:
Его можно использовать не только в скриптах, но также в интерпретаторе и модулях / пакетах.
Переводчик:
>>> print(__name__)
__main__
>>>
Автор сценария:
test_file.py :
print(__name__)
В результате чего __main__
Модуль или пакет:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
В результате чего somefile
Обратите внимание, что при использовании в пакете или модуле, __name__
принимает имя файла. Путь к фактическому модулю или пути пакета не указан, но имеет свой собственный DunderAlias __file__
, который учитывает это.
Вы должны увидеть, что, куда __name__
, где находится главный файл (или программа), всегда будет возвращаться __main__
, и если это модуль / пакет или что-либо, выполняющееся на каком-либо другом скрипте Python, вернет имя файла, в котором он находится. возникла из.
Практика:
Наличие переменной означает, что ее значение может быть перезаписано («может» не означает «следует»), перезапись значения __name__
приведет к недостаточной читаемости. Так что не делай этого ни по какой причине. Если вам нужна переменная, определите новую переменную.
Всегда предполагается, что значение __name__
должно быть __main__
или имя файла. Повторное изменение этого значения по умолчанию вызовет еще большую путаницу в том, что оно пойдет на пользу, что вызовет проблемы в дальнейшем.
пример:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
В целом считается хорошей практикой включать if __name__ == '__main__'
в сценарии.
Теперь, чтобы ответить if __name__ == '__main__'
:
Теперь мы знаем, что поведение __name__
вещей становится понятнее:
if
Является управление потоком заявление , которое содержит блок кода будет выполняться , если значение , данное верно. Мы видели, что __name__
может принимать либо
__main__
имя файла, из которого он был импортирован.
Это означает, что если __name__
равно, __main__
то файл должен быть основным файлом и должен фактически выполняться (или интерпретатором), а не модулем или пакетом, импортированным в скрипт.
Если действительно __name__
принимает значение, __main__
то все, что находится в этом блоке кода, будет выполняться.
Это говорит нам о том, что если выполняемый файл является основным файлом (или вы запускаете непосредственно из интерпретатора), то это условие должно выполняться. Если это пакет, то не должен, и значение не будет __main__
.
Модули:
__name__
также может использоваться в модулях для определения имени модуля
Варианты:
Также можно делать другие, менее распространенные, но полезные вещи __name__
, некоторые из которых я покажу здесь:
Выполняется, только если файл является модулем или пакетом:
if __name__ != '__main__':
# Do some useful things
Выполнение одного условия, если файл является основным, и другого, если это не так:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
Вы также можете использовать его для предоставления запускаемых функций / утилит справки для пакетов и модулей без сложного использования библиотек.
Это также позволяет запускать модули из командной строки в качестве основных сценариев, что также может быть очень полезным.
if __name__ == "__main__":
Является ли состояние блока устаревшим или устаревшим по сравнению с Python 3? Я нашел некоторую информацию, подтверждающую это.