如何配置IPython以与普通Python REPL相同的方式执行单元块?
香草Python REPL:如何配置IPython以与普通Python REPL相同的方式执行单元块?,python,ipython,read-eval-print-loop,Python,Ipython,Read Eval Print Loop,香草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'
...
'nana'
'nananana'
'nananananananana'
'nananananananananananananananana'
'batman'
>>>
具有相同解释器的IPython REPL:
>>> 'na'
'na'
>>> for i in range(4):
... f'{_+_}'
... else:
... 'batman'
...
>>> _
'na'
这种差异是,并且与环境无关。是否可以将IPython配置为像普通Python REPL那样编译/执行单元块?我希望IPython不会干扰或修改这些底层运行时机制。通过%config
魔术命令将设置设置为'all'
:
%config InteractiveShell.ast_node_interactivity='all'
或者在您的ipython_config.py
c.InteractiveShell.ast_node_interactivity = 'all'
这将导致IPython以'single'
模式编译所有内容,该模式触发sys.displayhook
,而不是'exec'
模式,后者不使用sys.displayhook
InteractiveShell.ast\u node\u互动性的可能设置当前为
'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\u expr”
:如果某个单元格的最后一条语句是表达式语句,则以“single”
模式编译该语句。这是IPython的默认设置
'none'
:以'exec'
模式编译所有内容
'last\u expr\u或\u assign'
:类似于'last\u expr'
,但如果最后一条语句是赋值语句,则执行一些额外的AST转换以打印赋值:
In [2]: xyz = "something else"
Out[2]: "something else"
这是什么魔法?!巨蟒是一种怪兽。斯奈克·凯斯喜欢下划线。iPython中的Under_分数重用以前的输出。\u
也不会在循环中重新分配。它总是最后一个Out[..]
值(而\uuu
和\uuuuu
是前2个值。请注意,在默认配置中(OP显然没有使用,但其他人可能会使用),它将在所有回显行的前面加上Out[\35;]:
,这有点破坏了效果。在这种情况下,通过添加配置文件设置c.TerminalInteractiveShell.prompts\u class='IPython.terminal.prompts.ClassicCompts',恢复到经典的Python提示符外观可能是个好主意。