Автор оригинала: 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 Отказ