Автор оригинала: Sathiya Sarathi Gunasekaran.
Вступление
Часто можно увидеть if __name__
в скриптах Python, которые мы находим в Интернете, или в одном из многих, которые мы пишем сами.
Почему мы используем этот оператор if-при запуске наших программ на Python? В этой статье мы объясним механику его использования, преимущества и где он может быть использован.
Атрибут __name__ и область действия __main__
Атрибут __name__ |/по умолчанию является одним из имен в текущей локальной области
scope . Интерпретатор Python автоматически добавляет это значение, когда мы запускаем скрипт Python или импортируем наш код в виде модуля.
Попробуйте выполнить следующую команду на вашем интерпретаторе Python. Вы можете узнать, что __name__
принадлежит списку атрибутов в dir()
:
dir()
__name__
в Python-это специальная переменная, которая определяет имя класса, текущего модуля или скрипта, из которого он вызывается.
Создайте новую папку с именем name_scripts
, чтобы мы могли написать несколько сценариев, чтобы понять, как все это работает. В этой папке создайте новый файл, script1.py
со следующим кодом:
print(f'The __name__ from script1 is "{__name__}"')
Вот это крученый мяч! Мы ожидали бы , что имя будет script1
, как и наш файл. Что означает вывод __main__
?
По умолчанию при выполнении скрипта интерпретатор считывает его и присваивает строку _main __
ключевому слову _name__/.
Это становится еще более интересным, когда вышеупомянутый сценарий импортируется в другой сценарий. Рассмотрим файл Python с именем script2.py
со следующим кодом:
import script1 # The print statement gets executed upon import print(f'The __name__ from script2 is "{__name__}"')
Как вы можете видеть, когда скрипт выполняется, выходные данные задаются как script 1
, обозначая имя скрипта. Окончательный оператор print находится в области действия script 2
, и когда он выполняется, выходные данные печатаются как: __main__
.
Теперь, когда мы понимаем, как Python использует область видимости __name__ | и когда он дает ей значение "__main__", давайте посмотрим, почему мы проверяем его значение перед выполнением кода.
если __имя__ в действии
Мы используем оператор if для запуска блоков кода только если наша программа является основной выполняемой программой. Это позволяет нашей программе быть исполняемой самой по себе, но дружественной к другим модулям Python, которые могут захотеть импортировать некоторые функции без необходимости запуска кода.
Рассмотрим следующие программы Python:
а) script3.py
содержит функцию с именем add ()
, которая вызывается только из основного контекста.
def add(a, b): return a+b if __name__ == "__main__": print(add(2, 3))
Вот результат, когда script3.py
вызывается:
Поскольку скрипт был выполнен непосредственно, ключевое слово __name__
присваивается __main__
, а блок кода под условием if __name__
выполняется.
б) Вот что происходит, когда этот фрагмент импортируется из script4.py
:
import script3 print(f"{script3.__name__}")
Блок под if __name__ |/from
script3.py не выполнил, как ожидалось. Это произошло потому, что ключевое слово
__name__ теперь присваивается имени скрипта:
script 3 . Это можно проверить с помощью инструкции print, которая выводит назначенное значение для ключевого слова
__name__ .
Как __name__ Помогает в развитии?
Вот несколько примеров использования этого оператора if-statement при создании скрипта
- Тестирование-это хорошая практика, которая помогает не только ловить ошибки, но и гарантировать, что ваш код ведет себя так, как требуется. Тестовые файлы должны импортировать в них функцию или объект. В этих случаях мы обычно не хотим, чтобы сценарий запускался как основной модуль.
- Вы создаете библиотеку, но хотели бы включить демо-версию или другие специальные случаи выполнения для пользователей. При использовании этого оператора if модули Python, использующие ваш код в качестве библиотеки, остаются незатронутыми.
Создание __main__.py Файл для модулей
Смысл наличия блока if __name__
состоит в том, чтобы получить фрагмент кода при условии выполнения, когда скрипт находится в области __main__
. Однако при создании пакетов на Python лучше, если код, который будет выполняться в контексте __main__
, будет записан в отдельный файл.
Рассмотрим следующий пример – пакет для выполнения вычислений. Структура дерева файлов для такого сценария может быть визуализирована следующим образом:
calc # --> Root directory ├── __main__.py ├── script1.py ├── script2.py ├── script3.py ├── script4.py └── src # --> Sub-directory ├── add.py └── sub.py
Древовидная структура содержит calc
в качестве корневого каталога и подкаталог, известный как src
. __main__.py
в каталоге calc
содержится следующее содержимое:
from src.add import add from src.sub import sub a, b = input("Enter two numbers separated by commas: ").split(',') a, b = int(a), int(b) print(f"The sum is: {add(a, b)}") print(f"The difference is: {sub(a, b)}")
В add.py
содержит:
def add(a, b): return a+b
И sub.py
содержит:
def sub(a, b): return a-b
Прямо за пределами каталога calc
скрипт может быть выполнен, а логика внутри каталога __main__.py
выполняется вызовом:
python3 calc
Эта структура также дает более чистый взгляд на расположение рабочей области, способ организации каталогов и точку входа, определенную внутри отдельного файла с именем __main__.py
.
Вывод
__name__
запускает блоки кода только тогда, когда наш скрипт Python выполняется непосредственно от пользователя. Это мощно, поскольку позволяет нашему коду иметь другое поведение, когда он выполняется как программа, а не импортируется как модуль.
При написании больших модулей мы можем выбрать более структурированный подход, имея __main__.py
файл для запуска модуля. Для автономного скрипта, включая if __name__
, это более простой метод отделения API от программы.