- Использование if __name__ == «__main__» в Python
- Введение
- Специальная переменная
- Первый случай использования
- Второй случай использования
- Заключение
- №37 Функция __main__ / для начинающих
- Что такое функция main()?
- Как создать функцию main
- Значение __name__
- if __name__ == __main__ в Python
- Как использовать __name__ и __main__
- Что делает if __name__ == “__main__”?
- 1 ответ 1
- Что делает if __name__ == «__main__»?
- if __name__ == «__main__» ¶
Использование if __name__ == «__main__» в Python
В данном руководстве мы рассмотрим для чего используется условие if name == «__main__» в Python, и в каких случаях оно нам может пригодиться.
Введение
Это стандартный код, который защищает пользователей от случайного вызова сценария, когда они не собирались этого делать, и его применение является хорошей практикой.
Это имеет значение для этих двух случаев использования:
- Мы запускаем его как основную программу с помощью python filename.py
- Импортируем файл в другой файл с помощью import filename
В последнем случае обычно мы хотим только импортировать модуль, а затем позже в коде выполнить некоторые функции или использовать класс из этого файла. Именно здесь вступает в игру оператор if __name__ == «main», который работает как защитник.
Давайте выясним, почему и как это работает.
Специальная переменная
Когда интерпретатор Python читает исходный файл, он делает две вещи:
- Во-первых, он устанавливает несколько специальных переменных, таких как __name__.
- Затем он выполняет весь код, который находит в файле.
Давайте посмотрим на следующий пример, где мы правильно используем оператор if __name__ == «main»:
Первый случай использования
Запустите его как основную программу с помощью python testa.py.
Интерпретатор Python присвоит переменной __name__ жестко закодированную строку «main», и таким образом код в операторе if будет выполнен:
Второй случай использования
Импортируйте testa в качестве модуля.
Интерпретатор присвоит «testa» переменной __name__ в модуле testa. Таким образом, код в операторе if не будет выполнен, и func_one не запустится.
Без if __name__ == «main» в testa.py вывод был бы следующим:
Обычно это не то, что нам нужно. Поэтому, если вы хотите запустить код в файле, хорошей практикой будет обернуть весь этот код в оператор if __name__ == «main».
Заключение
В этой статье мы рассмотрели различные способы использования инструкции if __name__ == «main». Научились применять их на практики и теперь знаем как использовать их у себя в проекте.
Источник
№37 Функция __main__ / для начинающих
В различных руководствах по Python часто используется функция main() . Но иногда это может быть и лишним.
Лаконичность — важный элемент программирования. И вполне логично задавать вопрос о том, зачем разработчику добавлять лишние строки в программу. Функция main() требует дополнительных строк, но она служит определенной цели.
В этом материале речь пойдет о функции main() , о том, какую пользу она приносит, а также о том, как правильно использовать ее в коде.
Что такое функция main()?
Main — это специальная функция, которая позволяет добавить больше логики в структуру программ. В Python можно вызвать функцию в нижней части программы, которая и будет запущена. Рассмотрим такой пример:
Запустим этот код:
Можно увидеть, что выражение «Дайте печенье.» выводится до «Печенье вкусное!», потому что метод cookies() не вызывается вплоть до последней строки, а именно в этой функции хранится предложение «Печенье вкусное!».
Такой код работает, но его довольно сложно читать. В таких языках программирования, как C++ и Java весь основной код программы хранится внутри основной функции. Это хороший способ для распределения всего кода программы. Те, кто только знакомится с Python, но уже работал, например, с C++ будут благодарны за использование функции main() .
Как создать функцию main
Есть две части основной функции Python. Первая — сама функция main() . В ней хранится код основной программы. Вызовем функцию cookies() и выведем выражение «Дайте печенье.» из функции main() :
Теперь вызовем функцию в конце программы:
Можно запустить код:
Результат не поменялся. Но теперь сам код читать легче. Пусть в нем и больше строк (и одна дополнительная строка), вполне очевидно, что именно происходит:
- Cookies() — функция, которая выводит «Печенье вкусное!».
- Когда программа запускается, определяются две функции: cookies() и main() .
- Затем функция main() вызывается.
- «Дайте печенье.» выводится в консоли.
- Затем вызывается функция cookies() , которая выводит в консоль «Печенье вкусное!».
Код не только чище, но и логичнее. Если вы пришли из другого языка, например, Java, но знаете, насколько это удобно.
Значение __name__
Прежде чем переходить к инструкциям __name__ и __main__ , которые часто используются вместе, нужно обсудить __name__ . __name__ хранит название программы.
Если запустить файл прямо, то значением __name__ будет __main__ . Предположим, что файл называется print_name.py :
Этот код можно запустить следующим образом:
Он вернет __main__ .
Предположим, что этот код был импортирован в качестве модуля в файл main.py :
Код внутри print_name.py исполняется потому что он был импортирован в качестве модуля в основной программе. Файл print_name выводит __name__ в консоль. Поскольку print_name был импортирован в качестве модуля, то и значением __name__ является print_name .
if __name__ == __main__ в Python
Вы наверняка встречали следующую конструкцию в программах на Python в функции main :
Что она значит? В Python любая переменная, начинающаяся с двух символов нижнего подчеркивания ( __ ), является специальной. Это зарезервированные значения, которые выполняют определенную роль в программе.
__main__ указывает на область видимости, где будет выполняться код. Если запустить Python-файл прямо, то значением __name__ будет __main__ . Если же его запустить в качестве модуля, то значением будет уже не __main__ , а название модуля.
Это значит, что строка выше вернет True только в том случае, если программа будет запущена прямо.
Если же ссылаться на файл как на модуль, то содержимое конструкции if не будет выполнено. Рассмотрим на примере.
Как использовать __name__ и __main__
Создадим новый скрипт на Python под названием username.py. В коде будем просить пользователя ввести его имя и проверять, не является ли его длина больше 5. Если символов не больше 5, то попросим ввести имя снова.
Начнем с определения глобальной переменной для хранения имени пользователя:
Источник
Что делает if __name__ == “__main__”?
Что происходит во время вызова if __name__ == «__main__»: ?
1 ответ 1
Когда интерпретатор Python читает исходный файл, он исполняет весь найденный в нем код. Перед тем, как начать выполнять команды, он определяет несколько специальных переменных. Например, если интерпретатор запускает некоторый модуль (исходный файл) как основную программу, он присваивает специальной переменной __name__ значение «__main__» . Если этот файл импортируется из другого модуля, переменной __name__ будет присвоено имя этого модуля.
В случае с вашим сценарием, предположим, что код исполняется как основная функция, например:
После задания специальный переменных интерпретатор выполнит инструкцию import и загрузит указанные модули. Затем он проанализирует блок def , создаст объект-функцию и переменную под названием myfunction , которая будет указывать на этот объект.
Затем он прочтет инструкцию if , «поймёт», что __name__ эквивалентен «__main__» , и выполнит указанный блок.
Одна из причин делать именно так – тот факт, что иногда вы пишете модуль (файл с расширением .py ), предназначенный для непосредственного исполнения. Кроме того, он также может быть импортирован и использован из другого модуля. Производя подобную проверку, вы можете сделать так, что код будет исполняться только при условии, что данный модуль запущен как программа, и запретить исполнять его, если его хотят импортировать и использовать функции модуля отдельно.
Что означает «threading_example в данный момент импортируется из другого модуля»?
Источник
Что делает if __name__ == «__main__»?
В Python нет какой-то специально выделенной функции main() , вы можете создать любую функции сами и вызвать ее где-то на верхнем уровне кода (это значит с нулевым отступом слева). Когда Python читает файл py, он выполняет весь код, который в нем содержится (за исключением тел методов и функций, конечно). Причем код выполняется в обоих случаях: а) если файл запущен напрямую б) если импортирован из другого скрипта.
Иногда некоторые скрипты могут играть роль и подключаемого модуля, и отдельно исполняемого файла. Поэтому из соображений безопасности следует делать проверку, чтобы код неожиданно не выполнился, если кто-то импортирует скрипт как модуль.
В процессе исполнения файла интерпретатор сам устанавливает особую строковую переменную __name__ , которая будет равна «__main__» , когда этот скрипт запущен непосредственно и будет равна названию модуля, если он импортирован из другого файла.
Рассмотрим пример. Файл one.py:
При запуске python one.py будет:
Пусть в другом файле two.py импортируем one:
Запуск python two.py даст:
Вывод такой: эта конструкция не является чем-то обязательным, а скорее правилом хорошего тона, чтобы ваш код не делал неожиданных вещей. Старайтесь ей пользоваться.
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈
Источник
if __name__ == «__main__» ¶
Достаточно часто скрипт может выполняться и самостоятельно, и может быть импортирован как модуль другим скриптом. Так как импорт скрипта запускает этот скрипт, часто надо указать, что какие-то строки не должны выполняться при импорте.
В предыдущем примере было два скрипта: check_ip_function.py и get_correct_ip.py. И при запуске get_correct_ip.py, отображались print из check_ip_function.py.
В Python есть специальный прием, который позволяет указать, что какой-то код не должен выполняться при импорте: все строки, которые находятся в блоке if __name__ == ‘__main__’ не выполняются при импорте.
Переменная __name__ — это специальная переменная, которая будет равна «__main__» , только если файл запускается как основная программа, и выставляется равной имени модуля при импорте модуля. То есть, условие if __name__ == ‘__main__’ проверяет, был ли файл запущен напрямую.
Как правило, в блок if __name__ == ‘__main__’ заносят все вызовы функций и вывод информации на стандартный поток вывода. То есть, в скрипте check_ip_function.py в этом блоке будет все, кроме импорта и функции return_correct_ip:
Результат выполнения скрипта:
При запуске скрипта check_ip_function.py напрямую, выполняются все строки, так как переменная __name__ в этом случае равна ‘__main__’ .
Скрипт get_correct_ip.py остается без изменений
Выполнение скрипта get_correct_ip.py выглядит таким образом:
Теперь вывод содержит только информацию из скрипта get_correct_ip.py.
В целом, лучше привыкнуть писать весь код, который вызывает функции и выводит что-то на стандартный поток вывода, внутри блока if __name__ == ‘__main__’ .
Начиная с 9 раздела, для заданий есть программные тесты, с помощью которых можно проверить правильность выполнения заданий. Для корректной работы с тестами, надо всегда писать вызов функции в файле задания внутри блока if __name__ == ‘__main__’ . Отсутствие этого блока будет вызывать ошибки, не во всех заданиях, однако это все равно позволит избежать проблем.
Источник