О стандартной идиоме Питона

avm

Опубликован:  2018-02-13T11:48:15.536760Z
1100

Продолжаю тему разработки на Питоне на пакетной базе Debian stretch. На этот раз хочу детально остановиться на python-коде и рассмотреть некоторые аспекты, касающиеся его исполнения.

В силу того, что Питон является интерпретируемым диалектом, код программ написанных на нём можно исполнить двумя различными методами:

  • исполнить файл программы в командной строке;
  • импортировать файл в другом модуле или в интерактивной сессии интерпретатора.

В самом общем случае, чтобы написать программу на Питоне, достаточно создать обычный текстовый файл с расширением .py. Например:

test.py

Попробуем исполнить эту программу:

sadmin@debian:~/tempo$ python3 test.py
Hello, World!
sadmin@debian:~/tempo$ 

Всё замечательно, при исполнении программы в командной строке на экран выводится стандартное приветствие. Теперь представим ситуацию, когда необходимо из файла test.py импортировать переменную s:

sadmin@debian:~/tempo$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from test import s
Hello, World!
>>> 

В данном случае интерпретатор исполнил весь код этого файла и опять вывел на экран стандартное приветствие.

Очень часто при программировании на Питоне возникают ситуации, при которых необходимо только импортировать имена из какого-то файла, при этом предотвратить исполнение порций кода, которые осуществляют процедурные вызовы. В случае с программой test.py мне нужно предотвратить вывод на экран стандартного приветствия при импорте переменной s, но оставить вывод приветствия на месте при исполнении программы в командной строке. Специально для таких случаев предусмотрена стандартная идиома, основанная на магическом свойстве каждого модуля Питона __name__.

Отредактирую файл программы test.py следующим образом:

hello

Исполняю файл в командной строке:

sadmin@debian:~/tempo$ python3 test.py 
Hello, World!
sadmin@debian:~/tempo$ 

Всё на месте, характер программы не изменился, при её исполнении в командной строке всё также выводится стандартное приветствие. А что будет при импорте?

sadmin@debian:~/tempo$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from test import s
>>> 

А при импорте переменной s стандартное приветствие на экран уже не выводится.

Попытаемся разобраться, как это устроено. Для этого создаю новый файл detect.py и пишу в него одну строчку:

print(__name__)

Исполняю этот файл в командной строке:

sadmin@debian:~/tempo$ python3 detect.py 
__main__
sadmin@debian:~/tempo$ 

Обращаю внимание, что при исполнении программы в командной строке имя исполняемого модуля определяется как __main__. Теперь попробуем импорт:

sadmin@debian:~/tempo$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import detect
detect
>>> 

При импорте имя исполняемого модуля определилось его действительным именем, то есть именем файла без расширения. Таким образом, элементарная логика, проверяющая имя исполняемого модуля, даёт возможность отделить в коде Питона процедурные вызовы от определений переменных, функций и классов.

 
Метки:  python3x, newbie
Комментарии: