web-dev-qa-db-fra.com

Pourquoi la saisie d'une variable (ou d'une expression) imprime-t-elle la valeur sur stdout?

Prenez cet exemple:

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

Comment et pourquoi Python fait-il cela sans instruction d'impression explicite?

Si je fais la même chose dans une cellule IPython , seule la dernière de ces valeurs est imprimée sur stdout de cette manière:

In[1]: 5+10
       1

Out[1]: 1

Pourquoi cela arrive-t-il?

17
Chayan Ghosh

Lorsque Python est en mode "interactif", il active certains comportements qu'il n'a pas en mode non interactif. Par exemple, sys.displayhook , initialement spécifié dans PEP 217 .

Si la valeur n'est pas None, cette fonction l'imprime dans sys.stdout et l'enregistre dans __builtin__._.

sys.displayhook est appelé sur le résultat de l'évaluation d'une expression entrée dans une session interactive Python.

Vous pouvez modifier ce comportement:

>>> 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?

Et aussi le ramener à la normale:

>>> sys.displayhook = sys.__displayhook__
>>> 3
3

Par défaut Python repl, sys.displayhook est

>>> import sys;
>>> sys.displayhook
<built-in function displayhook>

mais dans IPython c'est

In [1]: import sys

In [2]: sys.displayhook
Out[2]: <IPython.terminal.prompts.RichPromptDisplayHook at 0x7f630717fa58>

C'est pourquoi vous voyez un comportement différent entre Python et IPython.

35
kojiro

C'est ainsi que fonctionnent tous les interprètes. Ils n'ont pas besoin de print, mais une chose, et sans print ils font le repr de tout, et print pas, par exemple:

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

Regardez les citations.

Voir aussi ceci:

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

repr fait de même.

2
U10-Forward