普通 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'
这个区别是显然与IPython编译代码的模式有关 https://stackoverflow.com/a/46029260/674039,并且与显示挂钩 https://docs.python.org/3/library/sys.html#sys.displayhook。是否可以将 IPython 配置为像普通 Python REPL 一样编译/执行单元块?我希望 IPython 不会干扰或修改此类底层运行时机制。
Set the InteractiveShell.ast_node_interactivity https://ipython.readthedocs.io/en/stable/config/options/terminal.html#configtrait-InteractiveShell.ast_node_interactivity设置为'all'
,或者通过%config
魔法命令:
%config InteractiveShell.ast_node_interactivity='all'
或者在你的ipython_config.py
c.InteractiveShell.ast_node_interactivity = 'all'
这将导致 IPython 编译所有内容'single'
mode,触发的模式sys.displayhook
, 代替'exec'
模式,不使用sys.displayhook
.
可能的设置InteractiveShell.ast_node_interactivity
目前是
-
'all'
: 编译所有内容'single'
mode.
-
'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'
mode 如果该语句是表达式语句。这是 IPython 的默认设置。
'none'
: 编译所有内容'exec'
mode.
-
'last_expr_or_assign'
: like 'last_expr'
,但是如果最后一个语句是赋值语句,则执行一些额外的 AST 转换来打印分配的值:
In [2]: xyz = "something else"
Out[2]: "something else"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)