编程语言
首页 > 编程语言> > 如何配置IPython以执行单元格块的方式与普通的Python REPL相同?

如何配置IPython以执行单元格块的方式与普通的Python REPL相同?

作者:互联网

香草PythonREPL:

>>> 'na'
'na'
>>> for i in range(4):
...     f'{_+_}'
... else:
...     'batman'
... 
'nana'
'nananana'
'nananananananana'
'nananananananananananananananana'
'batman'
>>> 

使用相同解释器的IPython REPL:

>>> 'na'
'na'
>>> for i in range(4): 
...     f'{_+_}' 
... else: 
...     'batman' 
...
>>> _
'na'

这个差异是apparently related to the mode in which IPython compiles code,与display hook无关.是否可以将IPython配置为编译/执行单元格块,就像普通的Python REPL一样?我更喜欢IPython不会干扰或修改这样的底层运行时机制.

解决方法:

通过%config magic命令将InteractiveShell.ast_node_interactivity设置设置为“all”:

%config InteractiveShell.ast_node_interactivity='all'

或者在你的ipython_config.py中

c.InteractiveShell.ast_node_interactivity = 'all'

这将导致IPython以“单一”模式编译所有内容,即触发sys.displayhook的模式,而不是“exec”模式,该模式不使用sys.displayhook.

目前,InteractiveShell.ast_node_interactivity的可能设置

>’all’:以’single’模式编译所有内容.
>’last’:在’single’模式下编译单元格的最后一个(简单或复合)语句.与像’所有’的情况不同

In [7]: for i in range(5):
   ...:     i
   ...: for i in range(3):
   ...:     i
   ...:     
Out[7]: 0
Out[7]: 1
Out[7]: 2

‘all’会从两个循环中打印出i的值.
>’last_expr’:如果该语句是表达式语句,则以’single’模式编译单元格的最后一个语句.这是IPython的默认值.
>’none’:以’exec’模式编译所有内容.
>’last_expr_or_assign’:与’last_expr’类似,但是如果最后一个语句是赋值语句,则执行一些额外的AST转换来打印分配的值:

In [2]: xyz = "something else"
Out[2]: "something else"

标签:python,ipython,read-eval-print-loop
来源: https://codeday.me/bug/20190527/1161495.html