Зачем нужна конструкция if __name__ == "__main__"?
- Что такое __name__ в Python?
- Почему код выполняется при импорте модуля?
Код под if __name__ == "__main__": выполняется, только когда файл запущен как скрипт, а не импортирован.
- При запуске
python app.pyу модуля__name__ == "__main__", при импорте — его имя - Позволяет одному файлу быть и модулем, и программой
А ещё Для multiprocessing на Windows и macOS это обязательно, иначе процессы запускаются рекурсивно
Подробно
При импорте Python выполняет весь код модуля сверху вниз: определения функций, классов и всё, что написано на верхнем уровне. Если там стоит запуск программы, он произойдёт при каждом import.
У каждого модуля есть переменная __name__. Python задаёт её так:
- если файл запущен напрямую (
python app.pyилиpython -m app) —"__main__"; - если файл импортирован — имя модуля, например
"app".
Поэтому код запуска прячут под проверку. Тогда файл можно импортировать, например в тестах, и пользоваться его функциями, не запуская программу.
Обычный шаблон — функция main() и вызов под проверкой. Это же нужно для multiprocessing: на Windows и macOS дочерний процесс заново импортирует главный модуль, и без проверки он снова запустил бы пул процессов.
Для пакетов точкой входа служит файл __main__.py: он выполняется при python -m package.
Пример
# app.py
def main():
print("программа запущена")
def helper(x):
return x * 2
if __name__ == "__main__":
main()
# test_app.py
from app import helper # main() не вызывается
assert helper(2) == 4Что хотят услышать
- Что Python выполняет модуль при импорте.
- Какое значение принимает
__name__в обоих случаях. - Практический смысл: импорт в тесты и другие модули.
- Связь с multiprocessing — плюс.
Частые ошибки
- Считать, что это «точка входа, как main в C», без объяснения механизма.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Код выполняется, только когда модуль импортирован, а не запущен как скрипт
- ✓Код выполняется, только когда файл запущен как скрипт, а не импортирован
- ✗Это объявление главной функции, без него программа не запустится
- ✗Условие нужно только в Python 2
Что спросят дальше
Разбор темы
- Окружение, импорты и тесты на pytest
Виртуальные окружения и зависимости, как работает импорт и чем опасны циклические импорты, __name__ == "__main__", pytest, фикстуры и mock.patch.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.