Python标准库:内置函数compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

这个函数用来编译一段字符串的源码,结果可以生成字节码或者AST(抽像语法树),字节码可以使用函数exec()来执行,而AST可以使用eval()来继续编译。

参数source是一串字符串的源码,或者是AST对象数组。

参数filename是读取字符串的文件对象,如果不是从文件里读取源码来编译,那么这里可以放一些用来标识这些代码的字符串。

参数mode是用来指明那种表示的源码类型;如果是exec类型,表示这是一个序列语句,可以进行运行;如果是eval类型,表示这是一个单一的表达式语句,可以用来计算相应的值出来;如果是single类型,表示这是一个单一语句,采用交互模式执行,在这种情况下,如果是一个表达式,一般会输出结果,而不是打印为None输出。

可选参数flagsdont_inherit是用来控制编译源码时的标志,可以查看PEP236文档来了解这些参数,以及相关编译的说明。如果两者使用缺省参数(也即两者都是零值),在调用本函数编译时,主要使用代码中指明的编译特征来对待;如果flags参数设置有值,而dont_inherit没有设置(即是零值),那么编译代码时,不仅源码的编译特征起作用,而且flags指明的特征也起作用,相当两者的并集;如果参数dont_inherit设置有值(即是非零值),编译语句时只有参数flags指明的编译特征值起作用,即是不使用源码里指明的特征。

编译特征是按位图的方式设置到参数里,可以查看__future__

可选参数optimize是用来指明编译器使用优化的等级;缺省值是-1,表示使用命令行参数-O中获取的优化等级为准;如果设置值为0(即是不用优化,__debug__是设置true),是没有优化;如果设置值为1assert语句被删除,__debug__设置为false;如果设置值为2,除了设置值为1的功能之外,还会把代码里文档说明也删除掉,达到最佳优化结果。

本函数编译代码时,如果语法出错会返回SyntaxError;如果代码包含一些空字节,则返回类型错误TypeError

注意事项:当采用singleeval类型编译时,如果有多行代码,每行代码后面至少有一个换行符,否则在code模块编译时就会提示编译的源码不完整错误。在Python 3.2版本之后,允许输入WindowsMac的换行符;当采用exec模式时,不需要在每个行后面输入换行符;在这个版本之后增加了优化参数。

例子:

#compile()
str = "for i in range(0,10): print(i)"
c = compile(str,'','exec')   # 编译为字节代码对象
exec(c)                          # 执行
 
str2 = "3*x + 4*y"
c2 = compile(str2, '', 'eval')  # 编译为表达式

输出结果如下:

0

1

2

3

4

5

6

7

8

9

 

蔡军生 QQ:9073204  深圳
Python标准库中的`compile`函数可将源代码编译为字节码对象。以下是使用`compile`函数编译`.py`源码的相关说明及示例。 ### 1. `compile`函数基本介绍 `compile`函数可以把Python代码字符串编译成字节码对象,对于重复执行的代码,编译后能提高执行效率[^2]。其基本语法如下: ```python compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) ``` - `source`:要编译的源代码,可以是字符串、AST对象。 - `filename`:代码文件的名称,如果代码不是从文件读取的,可以传入一个描述性的字符串。 - `mode`:指定编译代码的模式,常见值有`'exec'`(用于执行多条语句)、`'eval'`(用于执行单个表达式)、`'single'`(用于执行单个交互式语句)。 - `flags`、`dont_inherit`、`optimize`:为可选参数,一般使用默认值即可。 ### 2. 编译`.py`文件的示例 假设存在一个名为`test.py`的文件,内容如下: ```python # test.py def func(): print('123456') return '666' func() ``` 以下是使用`compile`函数编译该`.py`文件的代码示例: ```python # 读取.py文件内容 with open('test.py', 'r', encoding='utf-8') as file: source_code = file.read() # 使用compile函数编译代码 compiled_code = compile(source_code, 'test.py', 'exec') # 执行编译后的代码 exec(compiled_code) ``` 在上述示例中,首先使用`open`函数读取`test.py`文件的内容,然后将读取的内容作为`source`参数传递给`compile`函数进行编译,`filename`参数传入`'test.py'`,`mode`参数使用`'exec'`表示执行多条语句。最后使用`exec`函数执行编译后的字节码对象。 ### 3. 另一个使用`compile`函数的示例 ```python code_string = """ def func(): print('123456') return '666' func() """ code = compile(code_string, 'string', 'exec') print(code) print(exec(code)) ``` 此示例直接将代码字符串作为`source`参数传递给`compile`函数进行编译,`filename`参数传入`'string'`,`mode`参数使用`'exec'`。编译后打印字节码对象,并使用`exec`函数执行编译后的代码[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值