Какая точка основной функции и/или __name__ == "__main__" проверяется на Python?
Возможный дубликат:
Что такое < if __name __ == "__ main __" : > сделать?
Я иногда замечаю что-то вроде скриптов Python:
if __name__ == "__main__":
# do stuff like call main()
В чем смысл этого?
Ответы
Ответ 1
Наличие значительного кода Python внутри функции (т.е. не на верхнем уровне модуля) является важной оптимизацией производительности, а также важным фактором хорошей организации кода (компилятор Python может оптимизировать доступ к локальным переменным в функции намного лучше, чем оптимизация "локальных" переменных, которые на самом деле являются глобальными модулями, поскольку семантика последних более требовательна).
Выполнение вызова функции условно для текущего модуля, выполняемого как "main script" (а не импортированного из другого модуля), делает возможным повторное использование самородков функциональности, содержащихся в модуле (поскольку другие модули могут импортировать он и просто вызывает соответствующие функции или классы), и, что еще важнее, он поддерживает твердое модульное тестирование (где всевозможные макеты и подделки для внешних подсистем обычно могут быть настроены до того, как функциональные возможности модуля будут проверены).
Ответ 2
Это позволяет импортировать python script или работать автономно - это разумный способ.
Если вы запустите файл python напрямую, переменная __name__
будет содержать __main__
. Если вы импортируете script, это не произойдет. Обычно, если вы импортируете script, вы хотите вызывать функции или ссылочные классы из файла.
Если у вас не было этой проверки, любой код, который не был в классе или функции, запускался при импорте.
Ответ 3
Единственная цель этого, если он находится в main.py
, - это то, что другие файлы могут import main
включать классы и функции, которые находятся в вашей "основной" программе, но без запуска исходного кода.
Без этого условия код, который находится в глобальной области, будет выполнен, когда он будет импортирован другими скриптами.
Ответ 4
Это отличное место для тестирования модулей. Это будет выполняться только тогда, когда модуль запускается непосредственно из оболочки, но он не будет запущен, если импортирован.