Вопрос с собеседования · Python

Зачем нужна конструкция if __name__ == "__main__"?

JuniorОкружение и инструменты
Ещё спрашивают так:
  • Что такое __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

Что спросят дальше

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования