Почему ввод переменной (или выражения) выводит значение в стандартный вывод?
Возьмите этот пример:
>>> 5+10
15
>>> a = 5 + 10
>>> a
15
Как и почему Python делает это без явного оператора печати?
Если я делаю то же самое в ячейке IPython, на stdout будет напечатано только последнее такое значение:
In[1]: 5+10
1
Out[1]: 1
Почему это происходит?
2 ответа
Когда Python находится в "интерактивном" режиме, он допускает определенные поведения, которых он не имеет в неинтерактивном режиме. Например, sys.displayhook
, первоначально указанный в PEP 217.
Если значение не None, эта функция печатает его в sys.stdout и сохраняет в
__builtin__._
,sys.displayhook вызывается в результате оценки выражения, введенного в интерактивном сеансе Python.
Вы можете изменить это поведение:
>>> import sys
>>> def shook(expr):
... print(f'can haz {expr}?')
...
>>> sys.displayhook = shook
>>> 123
can haz 123?
>>> False
can haz False?
>>> None
can haz None?
И также установите его в нормальное состояние:
>>> sys.displayhook = sys.__displayhook__
>>> 3
3
В реплере Python по умолчанию sys.displayhook
является
>>> import sys;
>>> sys.displayhook
<built-in function displayhook>
но в IPython это
In [1]: import sys
In [2]: sys.displayhook
Out[2]: <IPython.terminal.prompts.RichPromptDisplayHook at 0x7f630717fa58>
Вот почему вы видите разное поведение между Python и IPython.
Так работают все переводчики. Им не нужны print
, но одно и без print
они делают repr
всего и print
нет, пример:
>>> 'blah'
'blah'
>>> print('blah')
blah
>>>
Посмотрите на цитаты.
Также посмотрите это:
>>> print(repr('blah'))
'blah'
>>>
repr
делает то же самое.