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