首 页IT知识库翔宇问吧收藏内容
当前位置:算搜IT乐园IT知识库Python

Python compile()方法

减小字体增大字体作者:本站  来源:本站整理  发布时间:2021-09-27 09:00:18

微信搜索本站订阅号:优雅的代码。欢迎关注。
优雅的代码

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

compile()语法格式

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

compile(sourcefilenamemodeflags = 0, dont_inherit = Falseoptimize = -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()函数


以上讲解了Python中compile函数的使用方法。如有问题,欢迎评论留言。

如需转载请注明出处:算搜IT乐园(http://www.suansuo.cn),并给出本文的链接地址:

http://www.suansuo.cn/article/python/2021/6538.html

微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。

个人成长离不开各位的关注,你的关注就是我继续前行的动力。

知识评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
愿您的精彩评论引起共鸣,带来思考和价值。
用户名:查看更多评论
分 值:100分 90分 80分 70分 60分 40分 20分
内 容:
验证码:
关于本站 | 网站帮助 | 广告合作 | 网站声明 | 友情连接 | 网站地图
本站部分内容来自互联网,如有侵权,请来信告之,谢谢!
Copyright © 2007-2021 suansuo.cn. All Rights Reserved.
科技行业净资产收益率多少合适,你在炒股中,收获了哪些经验?_策澡股票网70种k线组合形态整理,K线技术中,什么是K线的持续形态?_侧擂股票网涨停k线图怎么表示,不会看K线图可以炒股票么?_策唠股票网大盘指数基金买哪个好,最近买的基金一直在跌。就几天之内跌了快10%了,应该止损吗?_册肮股票网属于资本市场特点的是,金融市场是怎样的?资本市场是大鱼吃小鱼吗?_厕恨股票网b股是什么意思,股票中的A.B股是什么意思?_厕仄股票网华宝证券科创板知识问卷答案,如何开通低佣金股票证券账户?_侧根股票网资本市场主要包括哪些市场,投行部与资本市场部哪个部门更好?_侧给股票网大盘A股指数上证,a股:大金融强势,上证指数被迫上涨当心短期吸引力大盘指数基金排名前十名,国内优秀的5类指数基金,筛选出最适合你的指数基金市盈率越高表明公司成长潜力越大,a股:未来最有可能翻倍的高成长企业名单,值得收藏研究!怎样计算盈利亏损,高铁亏损说:18个铁路局,有12个亏损,只有6个盈利!营业利润率的定义,如何计算企业利润?市盈率出现负50是好还是不好,市盈率越低股票越好吗亏损怎么计算,受伤了,赔偿金额怎么算?应该提供什么证据来证明?房地产利润率计算公式,处置投资性房地产?负债多少不能贷款买房,个人商业贷款买房需要满足什么条件资产负债率指标的主要作用是,资产负债表怎么看?如何看懂资产负债表?各行业及公司最新市盈率比较表,为什么不同股票的市盈率差别会如此之大?核心负债比率中核心负债的定义为,时隔两个月,重疾保险的定义将再次咨询,大型保险公司可能会欢迎改革股市上市盈率是什么意思,人炒股收益率能到20%就算高手,而基金却很容易达到20%,为什么大多投资者还是选择买股票而不买基金呢?一般企业资产负债率是多少,问:资产负债率对企业营运能力的影响?动态市盈率与静态市盈率哪个大,怎么看股票的市盈率?市盈率出现负数是什么情况?,股票的市盈率有参考意义吗?筹码峰怎么看图解知乎,运用筹码分布把握主升浪,说明庄家横盘洗盘,散户捂股坐等赚钱东方财富看筹码分布,求东方财富选股公式?双筹码峰是怎么回事,筹码分布的股票交易技术,捕捉中线双牛股!股票筹码峰有三个峰,筹码分布:“上峰不死,下跌不止,多峰密集,方向延续”,多次被验证销售费用率计算公式,管理费用率和销售毛利率相等么?股票估值看市净率还是市盈率,哪些股票不能碰?