Перш ніж пояснити що-небудь if __name__ == '__main__'
, важливо зрозуміти, що __name__
таке і що це робить.
Що таке __name__
?
__name__
є DunderAlias - може розглядатися як глобальна змінна (доступна через модулі) і працює аналогічно global
.
Це рядок (глобальний, як згадувалося вище), як зазначено type(__name__)
(поступається <class 'str'>
), і є вбудованим стандартом для версій Python 3 і Python 2 .
Де:
Його можна не тільки використовувати в сценаріях, але також можна знайти як в інтерпретаторі, так і в модулях / пакетах.
Перекладач:
>>> print(__name__)
__main__
>>>
Сценарій:
test_file.py :
print(__name__)
У результаті __main__
Модуль або пакет:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
У результаті somefile
Зауважте, що при використанні в пакеті або модулі __name__
приймає ім'я файлу. Шлях фактичного шляху модуля або пакета не заданий, але має власні DunderAlias __file__
, що дозволяє це зробити.
Ви повинні бачити, що де __name__
, де це основний файл (або програма), завжди буде повертатися __main__
, і якщо це модуль / пакет, або що-небудь, що працює з іншим сценарієм Python, поверне ім'я файлу, де він походить від с.
Практика:
Бути змінною означає, що її значення можна перезаписати ("може" не означає "повинно"), замінивши значення__name__
призведе до недостатньої читабельності. Тому не робіть цього з будь-якої причини. Якщо вам потрібна змінна, визначте нову змінну.
Завжди передбачається, що значення __name__
має бути __main__
або ім'я файлу. Повторна зміна цього значення за замовчуванням призведе до більше плутанини, що воно принесе користь, і спричинить проблеми далі за лінією.
приклад:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
Взагалі вважається хорошою практикою включати if __name__ == '__main__'
в сценарії.
Тепер відповісти if __name__ == '__main__'
:
Тепер ми знаємо, що поведінка __name__
речей стає зрозумілішою:
An if
управління потоком, який містить блок коду, буде виконуватися, якщо задане значення є істинним. Ми бачили, що __name__
може приймати
__main__
або ім’я, або ім'я файлу, з якого імпортовано.
Це означає, що якщо __name__
дорівнює, __main__
то файл повинен бути основним файлом і насправді повинен працювати (або це інтерпретатор), а не модуль чи пакет, імпортований у сценарій.
Якщо справді __name__
приймає значення, __main__
то виконується все, що є в цьому блоці коду.
Це говорить нам про те, що якщо запущений файл є основним файлом (або ви працюєте безпосередньо з інтерпретатора), то ця умова повинна виконуватися. Якщо це пакет, то його не повинно бути, а значення не буде__main__
.
Модулі:
__name__
може також використовуватися в модулях для визначення назви модуля
Варіанти:
Також можна робити інші, менш поширені, але корисні речі __name__
, деякі з яких я покажу тут:
Виконання, лише якщо файл є модулем або пакетом:
if __name__ != '__main__':
# Do some useful things
Запуск однієї умови, якщо файл є основним, а інший, якщо він не:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
Ви також можете використовувати його для надання дозволених функцій / утиліт, що можна виконувати, на пакунках та модулях без детального використання бібліотек.
Він також дозволяє запускати модулі з командного рядка як основні сценарії, що також може бути дуже корисно.
if __name__ == "__main__":
застарілий / застарілий стан блоку на Python 3? Я знайшов деяку інформацію, яка говорить про це.