Python, якщо __name__ == __main__ Пояснено прикладами коду

Коли інтерпретатор 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.