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

标签 python ipython read-eval-print-loop

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/

相关文章:

python - 创建每个实例的属性描述符?

jquery - Django 延迟加载分页

Python if any() 不起作用

node.js - 从 `coffee` 可执行文件调用函数

clojure - 为什么 ^metadata '符号不起作用?

python - Scipy 数值积分

python - curses 模块中的标准键功能

python - 在 Spyder IPython 控制台中自动关闭括号和引号?

python - conda 环境使用单独的 ipython 和 matplotlib 配置文件的最佳方式

ruby - pry ( ruby REPL): How can I turn automatic echo off