Каково назначение конструкции `if __name__ == ‘__main__’` в Python?

Ответ

Конструкция if __name__ == "__main__" позволяет выполнить блок кода только в том случае, если Python-файл запускается как основной скрипт, а не импортируется как модуль в другой файл.

Это работает благодаря специальной переменной __name__, которую Python устанавливает автоматически:

  • При прямом запуске файла (например, python my_script.py), значение __name__ равно "__main__".
  • При импорте файла (например, import my_script), значение __name__ равно имени модуля (в данном случае, "my_script").

Основные сценарии использования:

  1. Создание исполняемых скриптов: Размещение точки входа в приложение, которая не должна срабатывать при импорте.
  2. Тестирование: Написание тестов или демонстрационного кода для функций модуля прямо в этом же файле.
  3. Разделение логики: Четкое отделение переиспользуемой логики (функции, классы) от кода, который ее запускает.

Пример:

# my_module.py

def reusable_function():
    """Эта функция может быть импортирована и использована в других модулях."""
    print("Вызвана переиспользуемая функция.")

def main():
    """Основная логика, которая выполняется только при прямом запуске."""
    print("Скрипт запущен напрямую.")
    reusable_function()

# Этот блок выполнится, только если запустить: python my_module.py
if __name__ == "__main__":
    main()

Ответ 18+ 🔞

Да ты посмотри, какая хитрая жопа эта конструкция if __name__ == "__main__"! Она же, сука, как швейцарский нож в мире питона. Вроде простая, а без неё — пиздец, нахуй, бардак.

Вот смотри, есть у тебя файл my_script.py. Ты его можешь либо запустить, как главный, либо импортировать в другой файл, как библиотечку. Так вот, питон сам, блядь, подставляет в переменную __name__ волшебное значение:

  • Если ты его в лоб запускаешь (python my_script.py), то __name__ становится "__main__". Типа, «я тут главный, нахуй!».
  • А если ты его импортируешь (import my_script), то __name__ становится именем самого модуля, то есть "my_script". Скромненько так, «я тут на подхвате».

И вот эта простая проверка if __name__ == "__main__": — это как дверь с глазком. Она говорит: «Э, дружок-пирожок, выполнять код внутри себя только если меня вызвали напрямую, а не через импорт».

Зачем это, блядь, нужно?

  1. Чтобы скрипт был исполняемым. Ты пишешь логику запуска, а она не сработает, когда файл используют как модуль. Красота, ёпта!
  2. Чтобы тесты не ебали мозг. Можешь прямо в файле с функциями написать проверочный код, и он не полезет, когда ты эту функцию импортируешь куда-то ещё.
  3. Чтобы разделять, блядь, мух от котлет. Всё, что можно переиспользовать (функции, классы) — сверху. А всякая стартовая хуйня, которая должна работать только при запуске — внутри этого if.

Смотри, как это выглядит вживую:

# my_module.py

def reusable_function():
    """Эта функция — золотая. Её можно таскать по всем проектам."""
    print("Вызвана переиспользуемая функция.")

def main():
    """А это уже наше, родное, что запустится только здесь."""
    print("Скрипт запущен напрямую, ёба!")
    reusable_function()

# И вот этот волшебный блок. Он сработает ТОЛЬКО если файл запускают, а не импортируют.
if __name__ == "__main__":
    main()

Попробуй, блядь:

  1. Запусти python my_module.py — увидишь оба принта.
  2. А потом открой другой файл и напиши import my_module — импортируется только функция, а main() молчит, как партизан. Потому что при импорте __name__ уже не "__main__", а "my_module".

Вот такая, блядь, простая и гениальная штука. Без неё писать скрипты — это как ебаться с медведем в берлоге: можно, но неудобно и чревато последствиями.