首页Python【Python内置函数】c...

【Python内置函数】compile()函数

Python 提供了许多内置函数,这些函数是Python语言的一部分,可以直接在Python程序中使用而无需导入任何模块。

本系列将会陆续整理分享一些的Python内置函数。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_functions





01
简介

compile() 函数用于将源代码字符串或 AST(抽象语法树)对象编译成代码对象。这些代码对象随后可以使用 exec() 或 eval() 函数来执行。
compile() 函数非常有用,尤其是在需要动态生成和执行代码时。需要注意的是,动态生成和执行代码可能会带来安全风险,特别是在处理不受信任的输入时。因此,在使用时应格外小心,以避免潜在的安全风险。

compile() 函数的基本语法如下:

compile(source,         filename,         mode,         flags=0        dont_inherit=False        optimize=-1)
参数说明:
  • source:要编译的源代码,可以是一个普通字符串、字节字符串或 AST 对象。
  • filename:源代码文件的名称。如果源代码不是从文件中读取的,可以传递一个可识别的值(例如 ‘<string>’);
  • mode:指定要编译的代码类型。可以是 ‘exec’(用于编译包含多个语句的代码块,如函数定义、类定义、循环、条件语句等)、‘eval’(用于编译单个表达式,如数学表达式、函数调用等)、 ‘single’(用于编译单条语句,如果语句是表达式,会打印结果;如果是语句,则执行语句);
  • flagsdont_inherit:控制应该激活哪些编译器选项以及允许使用哪些未来特性。如果这两个参数都不存在(或都为零),那么代码将使用与调用 compile() 的代码相同的标志进行编译。如果提供了 flags 参数,而 dont_inherit 参数不存在(或为零),那么将使用 flags 参数指定的编译器选项和未来声明,这些选项将附加到原本会使用的标志中。如果 dont_inherit 是一个非零整数,那么 flags 参数就是它——周围代码中的标志(未来特性和编译器选项)将被忽略;
  • optimize:指定编译器的优化级别。默认值为-1,表示使用解释器的优化级别(由-O选项确定)。其他值包括0(无优化,__debug__True)、1(移除断言语句,__debug__False)和2(移除文档字符串,同时移除断言)。

需要注意的是:

  • 如果编译的源代码无效,compile() 函数将引发 SyntaxError

  • 如果源代码包含空字节,将引发 ValueError
  • 当在 ‘single’ 或 ‘eval’ 模式下编译包含多行代码的字符串时,输入必须以至少一个换行符终止,以便于在 code 模块中检测不完整和完整的语句。
  • 编译为 AST 对象时,由于 Python AST 编译器的栈深度限制,一个足够大或复杂的字符串可能会导致 Python 解释器崩溃。

返回值:

compile() 函数返回一个 代码对象或 抽象语法树对象。compile() 函数本身不会执行代码,它只是将代码编译为代码对象。要执行代码对象,需要使用 exec() 或 eval() 函数。

02
使用

下面是一些使用 compile() 函数的示例:

  • 示例 1:编译并执行一段代码

假设源代码存储在名为 ‘source.txt’ 的TXT文件中,内容如下:

def greet(name):
    print(f"Hello, {name}!")
greet("Alice")

可以通过以下代码读取该文件中的内容,并使用compile()函数将其编译为代码对象,然后执行它:

# 读取txt文件中的代码
file_path = 'source.txt'
with open(file_path, 'r', encoding='utf-8') as file:
    code_content = file.read()

# 编译代码
# 源代码是一个完整的代码块,使用 'exec' 模式
code_object = compile(code_content, file_path, 'exec')

# 执行编译后的代码对象
exec(code_object)  # 输出: Hello, Alice!
  • 示例 2:编译并计算一个表达式

在 ‘single’ 模式下,表达式的计算结果会被自动打印。

expression = "3 + 5"

# 编译表达式
code_object = compile(expression, '<string>''single')

# 计算编译后的表达式
result = eval(code_object)  # 输出: 8
  • 示例 3:编译并执行一段代码

使用Pythonast模块创建一个抽象语法树(AST),然后通过compile()函数将其编译为代码对象,并最终通过exec()执行该代码对象。

import ast

# 创建一个简单的 AST 对象
tree = ast.parse("x = 10")

# 编译 AST 对象
code_object = compile(tree, '<string>''exec')

# 执行编译后的代码对象
exec(code_object)
print(x)  # 输出: 10

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments