Python compile()函数

时间:2020-02-23 14:42:32  来源:igfitidea点击:

Python compile()函数用于将源代码编译为代码对象或者AST模块对象。
可以根据提供的模式使用exec()或者eval()函数执行返回的代码对象,以构造代码对象。

Python compile()

Python compile()函数语法为:

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

让我们看一下compile()函数参数。

  • source:用于创建代码对象的Source。
    这可以是字符串,字节字符串或者AST模块对象。

  • 文件名:如果您正在从文件中读取代码字符串,则应在此处提供其名称以供参考。
    它不是用于创建代码对象,而是用于使代码可读。

  • 模式:此参数指定代码的类型。
    允许的值是exec,eval和single。
    如果源包含多个python语句,请使用exec。
    如果source是单个python表达式,请使用eval。
    如果源由单个交互式语句组成,则使用单个。

  • 可选参数flagsdont_inherit控制将来的哪些语句会影响源代码的编译。
    如果两者都不存在(或者两者都不为零),则使用在调用compile()的代码中有效的将来的语句对代码进行编译。

  • 参数" optimize"指定编译器的优化级别。

Python compile()示例

让我们看一下具有不同来源的compile()函数示例。

将字符串源编译为代码

# compile() with string source
code_str = 'x=5\ny=10\nprint("sum =",x+y)'
code = compile(code_str, 'sum.py', 'exec')
print(type(code))
exec(code)

输出:

<class 'code'>
sum = 15

请注意,编译函数的返回类型为"代码"对象。
另外,我们在这里使用exec(),因为源字符串包含多个python语句。
请注意,代码对象正在由exec()函数执行,并且" sum = 15"正在控制台中打印。

从文件读取代码并进行编译

假设我们有以下内容的" my_code.py"文件。

x = 10
y = 20
print('Multiplication = ', x * y)

我们可以将此文件内容作为字符串读取,并将其编译为代码对象并执行。

# reading code from a file
f = open('my_code.py', 'r')
code_str = f.read()
f.close()
code = compile(code_str, 'my_code.py', 'exec')
exec(code)

用eval() compile()

我们来看一个将python表达式编译为代码并使用eval()函数执行该代码的示例。

# eval example
x = 5
code = compile('x == 5', '', 'eval')
result = eval(code)
print(result)

code = compile('x + 5', '', 'eval')
result = eval(code)
print(result)

输出:

True
10

带字节字符串源的compile()

让我们看一个使用字节字符串作为源的示例。

bytes_str = bytes('x == 5', 'utf-8')
print(type(bytes_str))
code = compile(bytes_str, '', 'eval')
result = eval(code)
print(result)

输出:

<class 'bytes'>
True

使用AST对象进行compile()

让我们看一个使用AST对象和compile()函数的示例。

import ast

ast_object = ast.parse("print('Hello world!')")
print(type(ast_object))
code = compile(ast_object, filename="", mode="exec")
print(type(code))
exec(code)

输出:

<class '_ast.Module'>
<class 'code'glt;
Hello world!