Рубрики
Без рубрики

Что делает if __name__: Do в Python?

если __name__ используется для управления поведением нашего кода Python, когда он выполняется непосредственно или импортируется как модуль. Этот учебник объясняет, как это сделать.

Автор оригинала: Sathiya Sarathi Gunasekaran.

Вступление

Часто можно увидеть if __name__ в скриптах Python, которые мы находим в Интернете, или в одном из многих, которые мы пишем сами.

Почему мы используем этот оператор if-при запуске наших программ на Python? В этой статье мы объясним механику его использования, преимущества и где он может быть использован.

Атрибут __name__ и область действия __main__

Атрибут __name__ |/по умолчанию является одним из имен в текущей локальной области scope . Интерпретатор Python автоматически добавляет это значение, когда мы запускаем скрипт Python или импортируем наш код в виде модуля.

Попробуйте выполнить следующую команду на вашем интерпретаторе Python. Вы можете узнать, что __name__ принадлежит списку атрибутов в dir() :

dir()
выход dir()

__name__ в Python-это специальная переменная, которая определяет имя класса, текущего модуля или скрипта, из которого он вызывается.

Создайте новую папку с именем name_scripts , чтобы мы могли написать несколько сценариев, чтобы понять, как все это работает. В этой папке создайте новый файл, script1.py со следующим кодом:

print(f'The __name__ from script1 is "{__name__}"')
script1.py выход

Вот это крученый мяч! Мы ожидали бы , что имя будет script1 , как и наш файл. Что означает вывод __main__ ?

По умолчанию при выполнении скрипта интерпретатор считывает его и присваивает строку _main __ ключевому слову _name__/.

Это становится еще более интересным, когда вышеупомянутый сценарий импортируется в другой сценарий. Рассмотрим файл Python с именем script2.py со следующим кодом:

import script1  # The print statement gets executed upon import

print(f'The __name__ from script2 is "{__name__}"')
script2.py выход

Как вы можете видеть, когда скрипт выполняется, выходные данные задаются как 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 вызывается:

script3.py выход

Поскольку скрипт был выполнен непосредственно, ключевое слово __name__ присваивается __main__ , а блок кода под условием if __name__ выполняется.

б) Вот что происходит, когда этот фрагмент импортируется из script4.py :

import script3

print(f"{script3.__name__}")
script4.py выход

Блок под 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
script1.py выход

Эта структура также дает более чистый взгляд на расположение рабочей области, способ организации каталогов и точку входа, определенную внутри отдельного файла с именем __main__.py .

Вывод

__name__ запускает блоки кода только тогда, когда наш скрипт Python выполняется непосредственно от пользователя. Это мощно, поскольку позволяет нашему коду иметь другое поведение, когда он выполняется как программа, а не импортируется как модуль.

При написании больших модулей мы можем выбрать более структурированный подход, имея __main__.py файл для запуска модуля. Для автономного скрипта, включая if __name__ , это более простой метод отделения API от программы.