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

Python Если __name__ объяснил примерами кода

Автор оригинала: Goran Aviani.

Когда интерпретатор Python читает файл Python, он сначала устанавливает несколько специальных переменных. Затем он выполняет код из файла.

Один из этих переменных называется __name__ Отказ

Если вы следуете по этой статье пошаговой и прочитаете его фрагменты кода, вы узнаете, как использовать Если __name__ И почему это так важно.

Модули Python пояснили

Файлы Python называются модулями, и они идентифицируются по .py расширение файла. Модуль может определять функции, классы и переменные.

Поэтому, когда интерпретатор запускает модуль, __name__ Переменная будет установлена как __main__ Если модуль, который работает, является основной программой.

Но если код импортирует модуль из другого модуля, то __name__ Переменная будет установлена на имя этого модуля.

Давайте посмотрим на пример. Создать модуль Python с именем file_one.py И вставьте этот код верхнего уровня внутри:

# Python file one module

print("File one __name__ is set to: {}" .format(__name__))

Запустив этот файл, вы увидите именно то, о чем мы говорили. Переменная __name__ Для этого модуля установлен __main__ :

File one __name__ is set to: __main__

Теперь добавьте еще один файл с именем file_two.py И вставьте этот код внутри:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

Кроме того, измените код в file_one.py Таким образом, мы импортируем file_two модуль:

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

Бег нашего file_one код еще раз покажет, что __name__ Переменная в file_one не изменился, и все еще остается набор __main__ Отказ Но теперь переменная __name__ в file_two устанавливается как его модуль, отсюда file_two Отказ

Результат должен выглядеть так:

File two __name__ is set to: file_two
File one __name__ is set to: __main__

Но беги file_two напрямую, и вы увидите, что его имя установлено на __main__ :

File two __name__ is set to: __main__

Переменная __name__ Для файла/модуля, который работает, будет всегда __main__ Отказ Но __name__ Переменная для всех других модулей, которые импортируются, будут установлены на имя их модуля.

Соглашения о именовании файлов Python

Обычный способ использования __name__ и __main__ Похоже, это выглядит:

if __name__ == "__main__":
   Do something here

Посмотрим, как это работает в реальной жизни, и как на самом деле использовать эти переменные.

Модифицировать file_one и file_two выглядеть так:

file_one :

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported")

file_two :

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")

Опять же, когда работает file_one Вы увидите, что программа распознана какая из этих двух модулей __main__ и выполнил код в соответствии с нашим первым Если еще заявления.

Результат должен выглядеть так:

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly

Сейчас беги file_two и вы увидите, что __name__ Переменная установлена на __main__ :

File two __name__ is set to: __main__
File two executed when ran directly

Когда модули, подобные этим, импортируются и выполняются, их функции будут импортированы, а верхний код выполнен.

Чтобы увидеть этот процесс в действии, измените ваши файлы, чтобы выглядеть так:

file_one :

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported")

file_two :

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")

Теперь функции загружены, но не запускаются.

Чтобы запустить одну из этих функций, измените Если __name__ часть file_one выглядеть так:

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
else:
   print("File one executed when imported")

При работе file_one Вы должны увидеть должно быть так:

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed

Кроме того, вы можете запустить функции из импортированных файлов. Чтобы сделать это, измените Если __name__ часть file_one выглядеть так:

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   file_two.function_three()
else:
   print("File one executed when imported")

И вы можете ожидать, что результат, как это:

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed
Function three is executed

Теперь скажем, file_two Модуль действительно большой с большим количеством функций (два в нашем случае), и вы не хотите импортировать их все. Модифицировать file_two выглядеть так:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

def function_four():
   print("Function four is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")

А для импорта конкретных функций из модуля используйте от Импорт блока в file_one файл:

# Python module to execute
from file_two import function_three

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   function_three()
else:
   print("File one executed when imported")

Заключение

Есть действительно хорошая форма для __name__ Переменная, нужна ли вы файл, который можно запускать в качестве основной программы или импортировать другими модулями. Мы можем использовать Если __name__ Блок, чтобы разрешить или предотвратить запуск частей кода, когда модули импортируются.

Когда переводчик Python читает файл, __name__ Переменная установлена как __main__ Если модуль работает или как имя модуля, если он импортируется. Чтение файла выполняет весь код верхнего уровня, но не функции и классы (поскольку они будут только импортировать).

Бюстгальтер Gьорт! (Это означает «молодец» в шведском!)

Посмотрите больше статей, как это на мой FreeCodeCamp Профиль , Средний профиль и другие забавные вещи, которые я строю на моем Страница GitHub Отказ