IPython y REPL se comportan de manera diferente cuando se muestran datos sin la función de impresión

Tenga en cuenta que todos los experimentos se han realizado en Python3.4.3 e IPython 5.1.0 (para python3).


Considere una función que devuelve la identidad:

def my_func(): return 1 

Ahora, esta función se llama desde un bucle dentro de una sesión REPL.

 for _ in range(3): my_func() 

En, IPython, no se muestra nada.

 In [96]: for _ in range(3): ...: my_func() ...: In [97]: 

Pero, en el REPL, algo es:

 >>> for _ in range(3): ... my_func() ... 1 1 1 >>> 

¿Por qué hay una diferencia?

¿Es por algo que hace IPython? He examinado el código de acceso y, en cualquier caso, son idénticos. Por lo tanto, no tiene nada que ver con la generación de códigos de byte, sino con la forma en que se interpreta en cualquier caso.

Para sys.displayhook cómo funciona, IPython comstack bucles en 'exec' modo 'exec' lugar de 'single' , por lo que sys.displayhook no se activa para las declaraciones de expresión dentro de un bucle. El intérprete interactivo regular ejecuta cualquier cosa que ingrese en 'single' modo 'single' . 'single' modo 'single' es el modo en que las declaraciones de expresión activan sys.displayhook .

Por qué IPython hace esto, el comportamiento regular de Python es más molesto que útil. Rara vez desea imprimir automáticamente los valores de las declaraciones de expresión en un bucle; Con más frecuencia, sucederá por accidente y desplazará las cosas que le interesen fuera de la pantalla.

IPython intenta proporcionar un comportamiento más útil. Es mucho más intuitivo imprimir explícitamente las cosas que desea imprimir que suprimir explícitamente las cosas que no desea imprimir.