Коли інтерпретатор Python читає файл Python, він спочатку встановлює кілька спеціальних змінних. Потім він виконує код із файлу.
Викликається одна з цих змінних __name__
.
Якщо ви будете покроково читати цю статтю та читати фрагменти коду, ви дізнаєтесь, як користуватися нею if __name__ == "__main__"
та чому це так важливо.
Пояснення модулів 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__
змінна в the file_one
не змінилася і все ще залишається встановленою __main__
. Але тепер змінна __name__
in 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__
і виконала код відповідно до наших перших if else
тверджень.
Результат повинен виглядати так:
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")
Тепер функції завантажуються, але не запускаються.
Щоб запустити одну з цих функцій, змініть if __name__ == "__main__"
частину, 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
Крім того, ви можете запускати функції з імпортованих файлів. Для цього змініть if __name__ == “__main__”
частину, 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")
А щоб імпортувати конкретні функції з модуля, використовуйте from
блок імпорту у 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__
змінної, незалежно від того, чи потрібен вам файл, який можна запускати як основну програму або імпортувати іншими модулями. Ми можемо використовувати if __name__ == "__main__"
блок, щоб дозволити або запобігти запуску частин коду під час імпорту модулів.
Коли інтерпретатор Python читає файл, __name__
змінна встановлюється так, __main__
ніби запущений модуль, або як ім'я модуля, якщо його імпортують. Читання файлу виконує весь код верхнього рівня, але не функції та класи (оскільки вони будуть лише імпортовані).
Бюстгальтер gjort! (Це означає "Молодці" по-шведськи!)
Перегляньте більше таких статей на моєму профілі freeCodeCamp, середньому та інших цікавих матеріалах, які я створюю на своїй сторінці GitHub.