首页 新闻 会员 周边 捐助

Python 内置函数 compile() 的第一个参数 mode 的取值说明

0
[已解决问题] 解决于 2025-08-29 09:03

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区别?

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-08-29 08:28
< >
分享
最佳答案
0

1. compile 的三种 mode

表格
复制
mode 值输入应是什么典型用途举例
'eval' 单个表达式(expression) 只求值并返回结果 1 + 2
'single' 单条交互式语句(statement) REPL 一行一行地跑 x = 10
'exec' 一串语句或完整模块 执行一个 .py 文件 整个文件内容

一句话记忆

  • expression:能算出一个值。
  • statement:做一件事。expression可以赋值,statement不可以,statement没有返回值
  • module:一堆 statement 的集合

  • REPL 是 Read-Eval-Print Loop 的缩写,中文常叫“交互式解释器”“交互式命令行”或“交互式运行环境”。

    一句话解释

    你在终端里敲 pythonipython 后出现的那个 >>> 提示符,就是 REPL。

    四步循环(REPL 名字的来源)

    1. Read 读入你输入的一行代码
    2. Eval 立即解释执行
    3. Print 把结果打印出来
    4. Loop 回到 >>> 等待下一条指令
    5. 常见 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. 纯表达式(如 1 + 2
        3. 执行完后把表达式的值再打印出来
      • '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
_java_python | 小虾三级 |园豆:984 | 2025-08-29 08:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册