Комментарии 11
Это всё верно, но никак не отвечает на поставленный в заголовке статьи вопрос.
Что такое “лишнее срабатывание кода”?
Эта проверка выдумана людьми, привыкшими программировать на С-подобных процедурных языках, где исходный код организован в виде программы с одной точкой входа, чему на выходе отвечает монолитное приложение. Но это не единственный используемый в программировании способ организации программы.
Программа на Питоне – это просто набор исполняемых операторов, к которым относятся в том числе и операторы def (между прочим, являющиеся не единственным способом создания функций).
Отлично. Я - target audience, на Питоне не пишу, но иногда что-то правлю, часто видел это заклинание.
Я бы добавил в список "нескольких вещей" то что один и тот же файл может и часто используется и как главная программа и как библиотека. Во многих языках так обычно не делают, а без этого не надо проверять главная ли мы программа или нет.
если мы запускаем программу через «побочную» программу
то у нас получается fork. Программа в данном контексте всегда одна.
TL;DR: python зачем-то считает, что каждый модуль может быть запущен отдельно как самостоятельная программа. Самый верхнеуровневый модуль (аргумент команды python) будет иметь внутри себя __name__ = "__main__"
Когда я познакомился с этим чудом первый раз, я подумал, что если даже вынести за скобки сомнительную изящность такого подхода, то почему это было не сделать через какую-то функцию в стандартной библиотеке? Зачем мне запоминать эти магические константы?
if isMainModule(): ...
>Python же относится к этому лояльно и позволяет пользователю не указывать точку входу (Python в качестве точки входа считает первую строку), что может приводить к серьезным проблемам.
Так вот она какая, эта "лояльность, а я-то думал...
Как-то довольно путано расписана довольно простая суть: в питоне при импорте модуля его код выполняется целиком. Соответственно, if name == "__main__" это просто костыль, чтобы избежать побочных эффектов от этого (в случае если модуль содержит код, который имеет смысл выполнять только при запуске скрипта напрямую). Никакой "точки входа" или прочей магии тут нету...
Тот самый случай, когда комментарии оказались полезнее статьи. Автор, вы вдохновились роликом на youtube от pythontoday?
Зачем __name__ == "__main__"?