Python compile() 语法
compile() 是 Python 的一个内置函数,它用于将一个字符串编译成一个代码对象或 AST 对象,然后可以由 exec() 或 eval() 函数执行。
语法:
compile(source, filename, mode)说明:
compile() 函数接收以下 3 个主要参数。
source(必选):要编译的源代码。它可以是一个字符串或一个 AST 对象(抽象语法树)。filename(必选):是一个字符串,表示从中读取代码的文件名。如果代码不是从文件中读取,则需要自己命名。mode(必选):是一个字符串,指定编译的模式。它决定了 source 将被如何解析。主要有 3 种模式:'exec':用于编译模块级别的代码,即可以包含多条语句(如函数定义、类定义、多行表达式等)。编译结果通常用于 exec()。'eval':用于编译单个表达式。编译结果通常用于 eval()。'single':用于编译单个交互式语句。如果语句以换行符结束,则编译结果可以包含一个 print 语句。此模式主要用于 code 模块。
compile() 函数还有其他参数(如 flag、dont_inherit、optimize 等),但这些参数几乎用不上,可以直接忽略。
提示:
- compile() 并不执行代码,它只是将源代码转换为可执行的中间形式。
- 在需要多次执行同一段动态代码时,可以先使用 compile() 编译一次,然后多次使用 exec() 或 eval() 执行编译后的代码对象。这样可以提高效率,因为避免了重复的解析步骤。
- 与 eval() 和 exec() 类似,由于 compile() 能够处理任意代码,因此它也存在安全风险。当 source 来自不可信的外部输入时,应格外小心。
Python compile() 摘要
| 使用频率 | 低 |
|---|---|
| 官方文档 | 查看 |
Python compile() 示例
接下来,我们通过几个简单的例子来讲解一下 Python compile() 函数是如何使用的。
示例 1:compile() 使用 eval 模式
src_code = 'print(666)'
exec_code = compile(src_code, 'test', 'eval')
exec(exec_code)
# 查看类型
print(type(exec_code))运行结果如下。
666
<class 'code'>分析:
compile(src_code, 'test', 'eval') 中的 src_code 是一个字符串,该字符串本质上是一段 Python 代码。'test' 是一个文件名,这个文件名是你自己取的。
示例 2:compile() 使用 exec 模式
src_code = '''a = 10
b = 20
print('a + b =', a + b)'''
exec_code = compile(src_code, 'test', 'exec')
exec(exec_code)运行结果如下。
a + b = 30分析:
compile() 函数的模式必须要选择正确,才能正常执行。对于这个例子来说,如果将 'exec' 改为 'eval' 或 'single',则会报错,小伙伴们可以自行测试一下。
不过有一种情况比较特殊,那就是如果是单条语句(比如上一个例子)使用 'exec' 模式也是可行的。换一句话来说,'exec' 模式既可以执行多条语句,也可以执行单条语句。
示例 3:compile() 使用 single 模式
pi = 3.14
result = compile('pi', 'test', 'single')
exec(result)运行结果如下。
3.14eval()、exec() 与 compile()
在 Python 中,字符串类型代码的执行函数有 3 个:eval()、exec()、compile(),它们之间的区别如下。
eval():用于计算并返回一个字符串表达式的值,它不能执行赋值、导入等代码语句。exec():用于动态执行一段完整的 Python 代码语句(可以是单条或多条语句),但不返回结果。compile():将字符串编译成字节代码,返回一个代码对象。该代码对象能通过 eval() 或 exec() 执行。
