Короткий ответ
Конструкция if __name__ == '__main__' проверяет, запущен ли файл напрямую как главная программа. При прямом запуске переменная __name__ равна строке '__main__', а при импорте — имени модуля, поэтому блок срабатывает только в первом случае.
Как это работает подробнее
Конструкция отделяет исполняемую часть модуля от объявлений, которые нужны импортирующему коду.
- Переменная __name__. Существует в каждом модуле и заполняется интерпретатором автоматически:
'__main__'при запуске файла как главной программы и имя модуля при импорте. - Разделение ролей. Под проверкой размещают исполняемый код вроде вызова
main(), а вне её — функции и классы для импорта. - Защита от побочных эффектов. Без проверки код верхнего уровня выполнялся бы и при импорте: печатал сообщения или запускал тяжёлые вычисления.
- Самопроверка модуля. В такой блок удобно класть собственные тесты, работающие только при прямом запуске файла.
Пример кода
Точка входа скрипта
def greet():
print('Hello!')
if __name__ == '__main__':
greet() # выполнится только при прямом запуске файлаЧто использовать на практике
- Точка входа. Помещай запуск скрипта, вызов
main(), под этот условный оператор. - Быстрые тесты. Используй блок для самопроверок, которые не должны мешать импортирующему коду.
- Библиотеки. В модулях, которые импортируют, оставляй на верхнем уровне только объявления.
Подводные камни
- Побочные эффекты. Без проверки код верхнего уровня сработает при импорте файла, что часто удивляет новичков.
- Ручное присваивание. Значение
__name__устанавливает интерпретатор, присваивать его вручную не нужно. - Опечатка в строке. Ошибка в
'__main__'тихо отключит точку входа.
Как отвечать на собеседовании
- Начни с назначения: блок выполняется только при запуске файла как скрипта → объясни, как интерпретатор заполняет __name__ → покажи пример с функцией main() → добавь, что без проверки код верхнего уровня выполнялся бы и при импорте.