说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python compile() 函数将指定的源(普通字符串、字节串或 AST 对象)作为代码对象返回。
compile() 方法返回的代码对象,可以使用 exec() 和 eval() 等方法调用,它们将执行动态生成的 Python 代码。
以下是一个典型的使用案例:
codeInString = 'a = 5\nb=6\nsum=a+b\nprint("sum =",sum)'
codeObejct = compile(codeInString, 'sumstring', 'exec')
exec(codeObejct)
# sum = 11
eval(codeObejct)
# sum = 11
由 compile() 生成的代码对象可以由内置函数 eval() 和 exec() 执行并得到执行结果。
compile() 函数语法如下:
compile(
source,
filename,
mode,
flags=0,
dont_inherit=False,
optimize=-1,
*,
_feature_version=-1,
)
参数:
将源代码编译成可由 exec() 或 eval()执行的代码对象。
compile() 将 source 编译成代码或 AST(Abstract Syntax Trees) 对象。代码对象可以被 exec() 或 eval() 执行。source 可以是常规的字符串、字节字符串,或者 AST 对象。
filename 实参需要是代码读取的文件名;如果代码不需要从文件中读取,可以传入一些可辨识的值(经常会使用 '<string>'
)。
mode 实参指定了编译代码必须用的模式。如果 source 是语句序列,可以是 'exec';如果是单一表达式,可以是 'eval';如果是单个交互式语句,可以是 'single'。(在最后一种情况下,如果表达式执行结果不是 None 将会被打印出来。)
可选参数 flags 和 dont_inherit 控制应当激活哪个 编译器选项 以及应当允许哪个 future 特性。 如果两者都未提供 (或都为零) 则代码会应用与调用 compile() 的代码相同的旗标来编译。 如果给出了 flags 参数而未给出 dont_inherit (或者为零) 则会在无论如何都将被使用的旗标之外还会额外使用 flags 参数所指定的编译器选项和 future 语句。 如果 dont_inherit 为非零整数,则只使用 flags 参数 -- 外围代码中的旗标 (future 特性和编译器选项) 会被忽略。
编译器选项和 future 语句是由比特位来指明的。 比特位可以通过一起按位 OR 来指明多个选项。 指明特定 future 特性所需的比特位可以在 __future__
模块的 _Feature
实例的 compiler_flag 属性中找到。 编译器旗标 可以在 ast 模块中查找带有 PyCF_
前缀的名称。
optimize 实参指定编译器的优化级别;默认值 -1 选择与解释器的 -O 选项相同的优化级别。显式级别为 0 (没有优化;__debug__
为真)、1 (断言被删除, __debug__
为假)或 2 (文档字符串也被删除)。
如果编译的源码不合法,此函数会触发 SyntaxError 异常;如果源码包含 null 字节,则会触发 ValueError 异常。
如果您想分析 Python 代码的 AST 表示,请参阅 ast.parse()。
引发一个 审计事件 compile 附带参数 source, filename。
注解:
在 'single' 或 'eval' 模式编译多行代码字符串时,输入必须以至少一个换行符结尾。 这使 code 模块更容易检测语句的完整性。
警告:
在将足够大或者足够复杂的字符串编译成 AST 对象时,Python 解释器有可能因为 Python AST 编译器的栈深度限制而崩溃。
版本更新情况有:
ast.PyCF_ALLOW_TOP_LEVEL_AWAIT
现在可在旗标中传入以启用对最高层级 await, async for 和 async with 的支持。更新时间:April 5, 2022, 9:19 p.m. 标签:python 代码