Обычно можно найти код с этой формой:
def hacer_algo():
print("algo")
if __name__ == "__main__":
hacer_algo()
Вместо, например:
def hacer_algo():
print("algo")
hacer_algo()
Также замечаем, что переменная __name__
не инициализирована нами, а существует в среде.
- В чем разница?
- Зачем предпочитать одно другому?
- Что это такое и как это работает?
Это тесно связано с тем, как работает интерпретатор Python:
Когда интерпретатор читает файл кода, он выполняет весь найденный в нем глобальный код . Это включает в себя создание объектов для любой функции или класса, определенных и глобальных переменных.
Каждый модуль (файл кода) в Python имеет специальный атрибут
__name__
, который определяет пространство имен, в котором он выполняется. Он используется для уникальной идентификации модуля в системе импорта.С другой стороны
"__main__"
, это имя области, в которой выполняется код более высокого уровня (ваша основная программа).Оболочка передает значение атрибута
__name__
в строку'__main__'
, если модуль работает как основная программа (когда вы запускаете его, вызывая оболочку в терминале с помощьюpython my_modulo.py
, дважды щелкнув ее, запустив в интерактивной оболочке и т. д.).Если модуль вызывается не как основная программа, а импортируется из другого модуля, атрибут
__name__
становится именем самого файла.Вот официальная документация.
То есть, если у вас есть файл с именем
mi_modulo.py
, если мы выполняем его как основную программу, атрибут__name__
будет равен'__main__'
, если мы используем его, импортируя его из другого модуля (import mi_modulo
), атрибут__name__
будет равен'mi_modulo'
.В основном то, что вы используете
if __name__ == “__main__”:
, это посмотреть, был ли модуль выполнен напрямую или нет (импортирован). Если она была выполнена как основная программа, выполняется код внутри условной.Одна из причин для этого заключается в том, что иногда вы пишете модуль (файл .py), который может выполняться напрямую, но в качестве альтернативы вы также можете импортировать и повторно использовать его функции, классы, методы и т. д. в другом модуле.
Например, в графических средах обычно создается пример использования виджета или виджетов, определенных в этом модуле, который служит примером использования, и тестируется сам модуль. Если вы запустите модуль, у нас будет пример графического интерфейса, но само собой разумеется, что когда мы импортируем модуль для использования виджета, мы не хотим, чтобы появилось маленькое окно ради искусства. Реальный пример в рамках Kivy :
Используя условное выражение, мы добиваемся того, что выполнение при непосредственном выполнении модуля отличается от его импорта из другого модуля. Все внутри условного выражения будет полностью проигнорировано интерпретатором при импорте модуля, но не при запуске в качестве основного модуля.
Чтобы увидеть, как это работает, вы можете попробовать код (следуя вашему собственному примеру):
Вы создаете модуль, который мы будем называть
mi_modulo.py
:В этой же папке вы создаете еще один модуль, который мы назовем
principal.py
Если вы запускаете скрипт
mi_modulo.py
напрямую:значение
__name__
будет"__main__"
и блок внутри будет выполненif __name__ == “__main__”:
:Если мы выполняем файл , который
principal.py
он использует ,mi_modulo.py
импортируя его, условие не выполняется,if __name__ == “__main__”
поэтому выполняется только глобальный код (print
исходный и объект функции создаетсяhacer_algo
в памяти). Функция выполняется только тогда, когда мы вызываем ее из основного модуля:Теперь давайте изменим скрипт
mi_modulo.py
на:Если мы запустим ее как основную программу, результат будет таким же, как и раньше, но если мы запустим ее сейчас
principal.py
, то получим следующее:Что происходит, так это то, что при импорте мы выполняем весь код импортированного модуля, включая вызов функции, которая теперь не завернута в условное выражение. После импорта основной модуль снова вызывает импортированную функцию.
Короче говоря, две формы, которые вы поставили, действительны, если вы всегда выполняете скрипт как основную программу, если вы также используете его, импортируя его, вы обычно не хотите, чтобы код выполнялся, если вы не вызываете функцию самостоятельно и что является причиной использования
if __name__ == “__main__”:
заявление
if
типа:Он используется для изоляции или разделения выполнения
(bloque de cosas dentro)
внутри программы (условие истинно), когда указанная программа полностью импортируется в другую.В этом случае при выполнении этого другого он не будет выполнен,
(bloque de cosas dentro)
потому что имеет ложное условие.Это позволяет мне делать разные вещи с одной и той же программой (прямо или импортировано).
Это основная функция программы, она используется для инициализации программы, для этого вы просто делаете следующее из cmd:
И программа инициализируется и выполняется. С другой стороны, зачем использовать этот метод, потому что вы можете запустить его или когда вы хотите добавить его как модуль, тогда программа не запустится, я думаю, это единственная разница.
Приветствую всех в сообществе, я собираюсь внести свою песчинку и объяснить это как можно проще, так как я понимаю многих людей, которые, как и я, в то время не могли понять это предложение или, скорее, это условие.
если __ name__ == "__ main__":
Это условие просто делает запрос, чтобы проверить, является ли исполняемый файл основным или корневым файлом программы. В Python метод __ name__ — это имя вашего файла. Пример: calculate.py >> он возьмет __ name__ имя вашего файла .py и сравнит его с __ main__, который всегда будет для python основным файлом, файлом с самой большой иерархией.
Но наверняка вам интересно, в чем смысл? Зачем мне тратить время на создание условия, если я хочу, чтобы программа работала и все!
Ответ на этот вопрос заключается в том, что мы представляем себе приложение с тысячами файлов .py, и они назначают вам тот проект, который уже делал кто-то другой, как бы вы узнали, какой у вас корневой файл? что есть начало всего? возможно, вы начнете с того, который, по вашему мнению, был корнем, а это не так!
Я думаю, что это было бы одной из основных причин (из многих причин), зачем использовать if __ name__ == "__ main__"
Это не обязательно, но это хорошая практика, чтобы использовать его, я надеюсь, что я хорошо объяснил и могу внести свою песчинку в сообщество. Приветствую всех коллег.