The mode must be 'exec' to compile a module, 'single' to compile a single (interactive) statement, or 'eval' to compile an expression.这是什么意思? expression statement python module区别?
1. compile 的三种 mode
mode 值 | 输入应是什么 | 典型用途 | 举例 |
---|---|---|---|
'eval' |
单个表达式(expression) | 只求值并返回结果 | 1 + 2 |
'single' |
单条交互式语句(statement) | REPL 一行一行地跑 | x = 10 |
'exec' |
一串语句或完整模块 | 执行一个 .py 文件 |
整个文件内容 |
一句话记忆
一句话解释
你在终端里敲python
或ipython
后出现的那个>>>
提示符,就是 REPL。四步循环(REPL 名字的来源)
Read 读入你输入的一行代码 Eval 立即解释执行 Print 把结果打印出来 Loop 回到>>>
等待下一条指令常见 REPL 场景
表格
场景 是否 REPL Windows 终端 python
回车后出现>>>
✅ macOS/Linux 终端 python3
回车✅ VS Code 的“Python 交互窗口” ✅ 直接双击 .py
文件运行❌ Jupyter Notebook 单元格 ✅(本质是高级 REPL) _
是 Python 交互式解释器里的一个特殊变量。
在 REPL(就是你在终端里敲>>>
的那种交互模式)里,最近一次表达式的结果会自动存到变量_
里。 它只在交互式会话里有效,脚本文件里不会自动出现>>> 1 + 2 # 结果 3 存进 _
3
>>> compile('1 + 2', '', 'eval') # 结果是一个 code 对象,**覆盖**了 _
<code object <module> at 0x...>
>>> _ # 现在 _ 里是 code 对象
<code object <module> at 0x...>
>>> exec(_) # 所以 exec 成功exec() arg 1 must be a string, bytes or code object
为什么交互式一行
x = 10
用'single'
REPL 需要支持:
变量赋值(语句) 纯表达式(如1 + 2
) 执行完后把表达式的值再打印出来'single'
就是为此设计的:
语法上既接受表达式又接受语句; 如果最后一行是表达式,编译器会额外生成一条PRINT_EXPR
指令,实现“自动回显”。>>> compile('x = 10', '', 'single')
<code object <single> ...>
>>> exec(_) # 赋值完成,无输出
>>> compile('x', '', 'single')
>>> exec(_) # 回显 x 的值
10为什么
1 + 2
用'eval'
而不是'single'
'eval'
要求输入是纯表达式,语法树必须以表达式节点结尾。 好处:调用eval(code)
直接得到运算结果(3
),不需要再exec
一次。 如果换成'single'
,虽然也能跑,但你得不到返回值,反而在交互解释器里会额外把结果打印出来——这不是你期望的“纯粹求值”。Python>>> compile('1 + 2', '', 'eval')
<code object <expr> ...> >>>
eval(_) # 直接得到 3 3