Python compile() 函数

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.14

eval()、exec() 与 compile()

在 Python 中,字符串类型代码的执行函数有 3 个:eval()、exec()、compile(),它们之间的区别如下。

  • eval():用于计算并返回一个字符串表达式的值,它不能执行赋值、导入等代码语句。
  • exec():用于动态执行一段完整的 Python 代码语句(可以是单条或多条语句),但不返回结果。
  • compile():将字符串编译成字节代码,返回一个代码对象。该代码对象能通过 eval() 或 exec() 执行。

上一篇: exec()

下一篇: globals()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号