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

newbie

Опубликован:  2018-09-09T09:45:45.863532Z

В этой презентации продолжим разговор о разработке на Python3, детально рассмотрим вопросы создания python-кода и некоторые аспекты, касающиеся его исполнения.

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

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

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

skZSAHjnBd.jpg

На скриншоте выше я создал текстовый файл test.py и написал в нём две строчки:

s = 'Hello, World!'
print(s)

Чтобы исполнить эту программу, достаточно в терминале дать следующую команду:

newbie@stretch:~/workspace$ python3 test.py
Hello, World!
newbie@stretch:~/workspace$ 

aWGGHh7MDd.jpg

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

>>> from test import s
Hello, World!
>>>

K9hhkplLxu.jpg

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

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

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

s = 'Hello, World!'

if __name__ == '__main__':
    print(s)

YEIZ8itEvC.jpg

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

newbie@stretch:~/workspace$ python3 test.py
Hello, World!
newbie@stretch:~/workspace$ 

DNurPRzYgz.jpg

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

>>> from test import s
>>> 

W9CoDEKUqa.jpg

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

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

print(__name__)

iwBg4qNjdZ.jpg

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

newbie@stretch:~/workspace$ python3 detect.py 
__main__
newbie@stretch:~/workspace$ 

GmZyQbf2q3.jpg

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

>>> import detect
detect
>>> 

BbEhT0EYvK.jpg

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

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