首页 > 开发 > Python > 正文

Python compile()方法

2023-04-24 19:21:35
字体:
来源:转载
供稿:网友

Python中可以使用compile()方法把源程序编译成代码对象或AST(Abstract Syntax Tree)模块对象。使用compile()方法生成的代码对象可以使用exec()函数或eval()函数执行。

compile()语法格式

官方文档给出的语法格式如下:

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

参数

source:必要参数,生成代码对象的源,其可以是一个字符串、字节字符串或AST对象。

filename:必要参数,该参数给出可以读取源代码的文件,如果不是从文件中读取源代码,则可以给一个可识别值,通常是一个字符串。

mode:必要参数,该参数用于指定代码编译的模式,主要有以下三种:

① exec:如果源代码包含多条Python语句时,选用此模式;

②eval:如果源代码仅包含一个表达式时,选用此模式;

③single:如果源代码包含一个交互语句时,选用此模式;

flags和dont_inherit是两个可选参数,控制编译器的选项是否在将来的Python版本中进行使用。flags默认为0,dont_inherit默认为False。如果这两个值都未指定或都为0,则代码使用compile()函数相同的标志影响代码。如果指定了flags参数,而未指定dont_inherit参数(或为0),那么由编译器指定的选项和由flags参数指定的将来语句将被用于将来进行编译。如果dont_inherit参数是非0的整数,那么flags参数就是代码中的将来特征和编译器选项,这些标记值将被忽略。

optimize:用于指定编译器的优化水平。默认值为-1,指使用Python解释器的优化级别(移除断言语句以及任何以__debug__值为条件的语句)。0表示不进行优化(__debug__值为True);1移除代码中的断言语句,同时模块中的__debug__值为false。2在1的基础上,同时移除文档字符串。

返回值

该函数返回一个代码对象,可供exec或eval执行。

compile()函数示例

下面是把一个字符串代码变异成代码对象的例子。

#定义源代码串,多行代码使用/n换行
str1 = "x=3/ny=5/nprint('x+y=',x+y)"
#编译成代码对象
code_obj = compile(str1,'sum.py','exec')
#code_obj的类型
print(type(code_obj))
#执行代码对象
exec(code_obj)

输出结果:

<class 'code'>
x+y= 8

从这个例子中,我们首先定义了一个源码字符串str1,并且让其作为compile()函数的第一个参数,第二个参数是一个必需的参数,所以我们这里使用sum.py作为其参数,其实这个参数必须有,但是什么样的字符串无所谓。因为有多行代码,我们这里使用exec编译模式。编译完后,使用exec调用代码对象,并输出其结果。同时,在这个例子中,我们注意到compile()函数生成的对象类型为<class 'code'>类型的。

下面这个例子是从文件中读取源代码的例子。

我们首先定义一个Python源程序文件:temp.py,在该文件中输入以下内容:

str1 = "I Love China"
str2 = "I Love Harbin."
print(str1 + "," + str2)

然后与temp.py文件同目录下建立一个新的文件cmp.py,代码如下:

#以只读格式打开文件
f = open('temp.py','r')
#读取文件的内容到变量str_code中
str_code = f.read()
#关闭文件
f.close()
#编译代码
code_obj = compile(str_code, 'temp.py', 'exec')
#执行代码对象
exec(code_obj)

输出结果如下:

I Love China,I Love Harbin.

这里虽然是从文件中读取的源代码,但第2个参数仍然随意写一个字符串。

下面再举一个eval模式的例子。

dic ={"lang1":"R","lang2":"Python"}
code_obj1 = compile('dic["lang1"]','value','eval')
res1 = eval(code_obj1)
print(res1)

code_obj2 = compile("print(dic)","","eval")
res2 = eval(code_obj2)

输出结果如下:

R
{'lang1': 'R', 'lang2': 'Python'}

下面再举一个source为字节字符串的例子。

s = "str1='我爱中国.'/nstr2='我爱北京'/nprint(str1+str2)"
bytes_s = bytes(s,'utf-8')
code_obj = compile(bytes_s,"","exec")
exec(code_obj)

输出结果如下:

我爱中国.我爱北京

上面代码中,bytes()函数的作用是把字符串转换为字节字符串,关于bytes()函数的使用,请见本站:Python bytes()函数。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表