Vanilla Python REPL:
>>> '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 那样编译/执行单元 block ?我希望 IPython 不会干扰或修改此类底层运行时机制。
最佳答案
设置InteractiveShell.ast_node_interactivity
设置为 'all'
,或者通过 %config
魔术命令:
%config InteractiveShell.ast_node_interactivity='all'
或者在你的ipython_config.py
c.InteractiveShell.ast_node_interactivity = 'all'
这将导致 IPython 在 'single'
模式下编译所有内容,即触发 sys.displayhook
的模式,而不是 'exec'
模式,不使用 sys.displayhook
。
目前 InteractiveShell.ast_node_interactivity
的可能设置是
'all'
:在'single'
模式下编译所有内容。'last'
:以'single'
模式编译单元格的最后一个(简单或复合)语句。不同于'all'
在类似情况下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 以与普通 Python REPL 相同的方式执行单元 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54136057/