Почему ввод переменной (или выражения) выводит значение в стандартный вывод? - PullRequest
0 голосов
/ 25 февраля 2019

Возьмите этот пример:

>>> 5+10
15
>>> a = 5 + 10
>>> a
15

Как и почему Python делает это без явного оператора печати?

Если я делаю то же самое в IPython ячейка, только последнее такое значение фактически выводится на стандартный вывод следующим образом:

In[1]: 5+10
       1

Out[1]: 1

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Когда 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.

0 голосов
/ 25 февраля 2019

Так работают все переводчики.Им не нужно никаких print, но одна вещь, и без print они делают repr всего, а print не требуется, например:

>>> 'blah'
'blah'
>>> print('blah')
blah
>>> 

Посмотрите нацитаты.

Также смотрите это:

>>> print(repr('blah'))
'blah'
>>> 

repr делает то же самое.

...