Python compile()内置函数 --编译成代码或AST对象

source 编译成代码或 AST 对象,代码对象可以被内置函数 exec()eval() 执行。source 可以是常规的 字符串字节字符串,或者 AST 对象

格式及参数

1
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

source:可以是常规的字符串、字节字符串,或者 AST 对象

filename:代码读取的文件名,如果代码不需要从文件中读取,可以传入一些可辨识的值(经常会使用 <string>

mode:指定了编译代码必须用的模式,如果 source 是:

语句序列,可以是 exec
单一表达式,可以是 eval
单个交互式语句,可以是 single,这种情况下,如果表达式执行结果不是 None 将会被打印出来

flags:变量作用域,局部命名空间,如果被提供,可以是任何映射对象

flagsdont_inherit 是用来控制编译源码时的标志

optimize:指定编译器的优化级别;默认值 -1 选择与解释器的 -O 选项相同的优化级别。显式级别:

0(没有优化;__debug__ 为真)
1(断言被删除, __debug__ 为假)
2(文档字符串也被删除)

参考资料

实例(python3.8.8)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
str1 = 'for i in range(3):print(i)'
a = compile(str1, '', 'exec')
print(a)
exec(a)

str2 = "print(1+11)"
b = compile(str2, '', 'eval')
print(b)
eval(b)


''' 输出
<code object <module> at 0x0000028BC1CC92F0, file "", line 1>
0
1
2
<code object <module> at 0x0000028BC1CC93A0, file "", line 1>
12
'''