Введение в переменную _ _name_ _ и варианты ее использования в Python
Скорее всего, вы встречали переменную __name__
при работе с кодом Python. Она выглядит следующим образом:
if __name__ == '__main__':
main()
Рассмотрим пример использования этой переменной при создании модулей в Python.
Зачем использовать переменную _ _name_ _?
Переменная __name__
(два нижних подчеркивания перед и после) — это особая переменная в Python, получающая значение в зависимости от того, каким образом выполняется содержащийся в ней сценарий.
Иногда функции в одних сценариях могут пригодиться вам в других. В Python можно импортировать этот сценарий в качестве модуля для другого сценария.
Благодаря этой переменной можно решить, стоит ли запускать сценарий или импортировать функции, определенные в сценарии.
Какие значения может содержать переменная __name__?
При запуске сценария значение переменной __name__
равно __main__
. При импортировании кода сценария она будет содержать название сценария.
Рассмотрим два случая использования.
Вариант 1 — Запуск сценария
Допустим, мы написали сценарий nameScript.py
, который выглядит следующим образом:
def myFunction():
print 'The value of __name__ is ' + __name__
def main():
myFunction()
if __name__ == '__main__':
main()
При запуске nameScript.py последует нижеприведенный процесс.
До запуска остальной части кода значение переменной __name__
установлено на __main__. После этого запускаются утверждения def main
и myFunction
. Поскольку установлено значение true, вызывается функция main. В свою очередь, вызывается myFunction. В результате выводится значение __main__
.
Вариант 2 — Импорт сценария в другой сценарий
Чтобы использовать myFunction в другом сценарии, например importingScript.py
, импортируем nameScript.py
в качестве модуля.
Код importingScript.py
выглядит следующим образом:
import nameScript as ns
ns.myFunction()
Получаем две области видимости: importingScript
и nameScript
.
В importingScript.py значение переменной __name__
установлено на __main__. При импортировании nameScript Python начинает искать файл, добавив .py
к названию модуля, а затем запускает код импортированного файла.
В этом случае значение установлено на nameScript. Снова запускаются утверждения def для main и myFunction. Однако в этот раз установлено значение false, а функция main не вызывается.
В importingScript.py вызываем myFunction, которая выводит nameScript. NameScript становится известен для myFunction при определении функции.
При вводе __name__
в importingScript получаем __main__
, поскольку Python использует значение, известное в области видимости importingScript.
Заключение
Мы рассмотрели варианты использования переменной __name__
при написании модулей. Эти модули также можно запустить самостоятельно, используя данные о том, как меняются значения этих переменных в зависимости от места их возникновения.
Перевод статьи Bert Carremans: What’s in a (Python’s) __name__?