compile() 编译源码为代码对象
最后更新:2026-09-22
compile() 编译源码为代码对象
compile() 把源代码字符串编译成代码对象,可交给 exec() / eval() 执行。
| 分类 | 内置函数 |
|---|---|
| 类型 | 内置函数 |
| Python 版本 | all |
📝 语法
compile(source, filename, mode)
⚙️ 参数
| source 必选 | 源代码(字符串、字节串或 AST 对象)。 |
|---|---|
| filename 必选 | 错误信息中显示的文件名;内联源码传 ' |
| mode 必选 | 编译模式:'exec' / 'eval' / 'single'。 |
| flags 可选 | 编译器标志位(如 ast.PyCF_ONLY_AST)。(默认值:0) |
| dont_inherit 可选 | 是否忽略外层编译标志。(默认值:False) |
| optimize 可选 | 优化级别;-1 表示使用解释器设置。(默认值:-1) |
返回值:code 对象,可传给 exec() / eval() 执行。
💥 异常
SyntaxError— 当源码存在语法错误时抛出。ValueError— 当 mode 无效或源码含空字节时抛出。TypeError— 当 source 或 mode 类型不正确时抛出。
▶ 示例
编辑下方代码,点击运行,在输出面板查看结果:
运行结果:
3
🏷️ 相关内置函数
💡 相关案例
更多实战案例即将上线,敬请期待。
❓ 常见问题
Qcompile() 的三个 mode 有什么区别?
A'exec' 编译语句块(if、def、for 等),'eval' 编译单个表达式(能求值),'single' 编译单条交互式语句并会打印表达式结果。
Qfilename 参数传什么?
A动态生成的内联代码惯例上传 '';它只出现在报错信息(traceback)里,与实际文件无关,不会真的读取文件。
Qcompile() 之后怎么执行?
A把返回的 code 对象传给 exec(code) 或 eval(code):'exec' 模式的代码对象用 exec,'eval' 模式的用 eval。
Q源码有语法错误会怎样?
A在 compile() 阶段就抛 SyntaxError,比直接 exec 字符串更早暴露问题,适合“先编译校验、后执行”的场景。