本系列将会陆续整理分享一些的Python内置函数。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_built-in_functions
compile(source,
filename,
mode,
flags=0,
dont_inherit=False,
optimize=-1)
-
source:要编译的源代码,可以是一个普通字符串、字节字符串或 AST 对象。 -
filename:源代码文件的名称。如果源代码不是从文件中读取的,可以传递一个可识别的值(例如 ‘<string>’); -
mode:指定要编译的代码类型。可以是 ‘exec’(用于编译包含多个语句的代码块,如函数定义、类定义、循环、条件语句等)、‘eval’(用于编译单个表达式,如数学表达式、函数调用等)、 ‘single’(用于编译单条语句,如果语句是表达式,会打印结果;如果是语句,则执行语句); -
flags和dont_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() 函数的示例:
-
示例 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:编译并执行一段代码
使用Python的ast模块创建一个抽象语法树(AST),然后通过compile()函数将其编译为代码对象,并最终通过exec()执行该代码对象。
import ast
# 创建一个简单的 AST 对象
tree = ast.parse("x = 10")
# 编译 AST 对象
code_object = compile(tree, '<string>', 'exec')
# 执行编译后的代码对象
exec(code_object)
print(x) # 输出: 10


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