Перш ніж пояснити що-небудь 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? Я знайшов деяку інформацію, яка говорить про це.