Python支持动态代码主要三个函数,分别是compile、eval和exec。本节介绍compile函数的语法和相关使用。compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像语法树)。

一、    语法

compile个内置函数,语法如下:

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

二、    参数解释:

1、    source:是一串字符串的源码,或者是AST(抽像语法树)对象数组,就是需要执行的代码对象。

2、    filename:参数filename用于在执行代码报错的运行时错误消息中显示该参数对应的信息,当source是执行代码从文件中读取的代码字符串时,则可以存放文件名,如果不是从文件里读取源码来编译,那么这里可以放一些用来标识这些代码的字符串,其值理论上是任何字符串,没有特殊要求,一般都放‘’,用于表示前面的source是个字符串,如果source放AST,则可以标识为‘’;

3、    mode:三个取值,分别是'exec'、'single' 、'eval',如果是‘exec’表示编译的是一段代码或模块, 'single'表示编译的是一个单独的语句, 'eval'表示编译的是一个表达式而不是一个语句。

这三种模式中,老猿初步验证凡是'single'模式能编译的就能‘exec’模式编译,‘eval’和二者不能互换。

4、    flags和dont_inherit

这两个参数是组合使用,可选参数 flags 和 dont_inherit 控制在编译 source 时要用到哪个 future 语句。

如果两者都未提供(或都为零)则会使用调用 compile() 的代码中有效的 future 语句来编译代码。 如果给出了 flags 参数但没有 dont_inherit (或是为零) 则 flags 参数所指定的 以及那些无论如何都有效的 future 语句会被使用。 如果 dont_inherit 为一个非零整数,则只使用 flags 参数 -- 在调用外围有效的 future 语句将被忽略。

future 语句使用比特位来指定,多个语句可以通过按位或来指定。具体特性的比特位可以通过 __future__ 模块中的 _Feature 类的实例的 compiler_flag 属性来获得。

不知道各位有明白的没有,以上这段解释直接来自于Python 标准库,老猿只是照抄,没有看懂,估计涉及Python的高级特性future,以后再研究吧,我们暂时都用缺省值。

5、    optimize:optimize到Python的代码优化机制。

Python为了适应不同的执行要求定义了几种代码优化的策略:

1)    缺省值是-1,表示使用命令行参数-O中获取的优化等级为准;

2)    如果设置值为0,是没有优化,__debug__为true支持debug信息(if __debug__语句下的语句,就是开发者根据需要加入的调试信息)在运行中展示;

3)    如果设置值为1,assert语句被删除,__debug__设置为false确保调试语句不执行;

4)    如果设置值为2,除了设置值为1的功能之外,还会把代码里文档字符串也删除掉,达到最佳优化结果。

三、    compile函数返回结果

1、    如果编译通过,结果可以生成字节码(类型code)或者AST(抽像语法树),字节码可以使用函数exec()或eval来执行,而AST可以使用eval()来继续编译(关于AST的内容本节都不介绍,ATS 对象:Abstract Syntax Tree,抽象语法树,是源代码语法结构的一种抽象表示。关于抽象语法树大家可以参考:https://zhuanlan.zhihu.com/p/26988179;

2、    exec 语句:exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码。需要说明的是在 Python2 中exec不是函数,而是一个内置语句;

3、    如果编译的源码不合法,此函数会触发 SyntaxError 异常;如果源码包含 空字节(空字符串),则3.5版本以前会触发 ValueError 异常,3.5版本后则不会触发可以编译通过并执行。注意:

1)    在 'single' 或 'eval' 模式编译多行代码字符串(这些串必须是一个完整语句或表达式而不是多个语句或表达式)时,输入必须以至少一个换行符结尾;

2)    如果编译足够大或者足够复杂的字符串成 AST 对象时,Python 解释器会因为 Python AST 编译器的栈深度限制而崩溃

四、    例子:

1、    从字符串编译

s="""

person=['张三','李四']

for p in person:  print('name=',p)

while(True):

s=input("I will exit,are you ready(y/n)?")

if s=='Y': break;

if s=='y': break;

"""

c=compile(s,'','exec')

上述代码包含两个语句,一个s赋值为一段代码的语句(注意这里用的多行字符串是用三个双引号标记的,这与前面讲字符串的内容不同,应该说前面介绍时的三引号是三个单引号,实际上三个双引号也可以,误导了大家非常抱歉),一个编译语句,这里编译用了三个参数,第一个是代码字符串,第二个是代码字符串的来源说明信息,你可以改成任何需要的内容,第三个是编译模式,用的是’exec’,也只能用‘exec’。编译完了就可以执行,等下再讲。

2、    从文件compiler.py读取内容编译

# compiler.py

with open('source.py') as f:

source = f.read()

executable = compile(source, 'source.py', 'exec')

涉及文件操作在后面再介绍,这里说明一下,source字符串变量的值是从文件compiler.py中读取的,编译实际上是编译的读取内容,而第二个参数文件名只是说明这些代码串是来源于 source.py,仅在代码有错时报告错误信息中展示文件名,你完全可以改成不相关的内容。

本节老猿详细介绍了动态执行的代码编译函数compile,其实在进行动态执行时,相关的语句可以经过调用compile函数编译,也可以不调用compile编译。其区别就是编译后对于重复执行的代码会提高效率。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

python语言继承6.3节例6-1中的person_第6.3节 Python动态执行之动态编译的compile函数...相关推荐

  1. python语言的计算生态规模有多大_【单选题】Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大?...

    [单选题]Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大? 更多相关问题 [问答题,简答题] 顾客关系管理系统如何给企业 ...

  2. python语言用什么来表明每行代码的层次关系_《计算机二级Python语言程序设计考试》第2章: Python语言基本语法元素...

    注明:本系列课程专为全国计算机等级考试二级 Python 语言程序设计考试服务 目录 考纲考点 程序的基本语法元素:程序的格式框架.缩进.注释.变量.命名.保留字.数据类型.赋值语句.引用 基本输入输 ...

  3. python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...

    [填空题]与文件系统相比,数据库系统的数据冗余度___________,数据共享性___________. [填空题]在数据库体系结构中,两级数据映象分别是指___________之间的数据映象与__ ...

  4. 下列选项中不属于python语言基本控制结构的是_下列选项中,不属于Python语言特点的是...

    [简答题]这个三个按钮分别表示什么?分别用图1 是?,图2是?图3是? [判断题]金属从液态转变为固态晶体的过程称为结晶. [多选题]简化的 Fe - Fe 3 C状态图上的 S 点是共析点,该点的温 ...

  5. Python语言的有限状态机实现样例

    #!/usr/bin/env python3class Connection(object):def __init__(self):self.change_state(ClosedConnection ...

  6. python语言的游戏引擎_在steam吧,你甚至可以讨论如何用python写一个2D游戏引擎...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 目前完整代码放送~ "#"后面的是注释 写注释像我这么良心的人很少了! #AbEngie Graphis Module #By Red ...

  7. python修改散点图中点的颜色_更改散点图中不同虚拟值的点的颜色 - python

    在我的数据集中,我有一个Price列用于房价,还有5个虚拟列用于城市中的不同位置.我要做的是用不同的颜色在散点图上显示数据点. 例如,在一个包含所有房屋价格的散点图上,我想要: 当dummy1表示房屋 ...

  8. word中取消链接上一节在哪_word中如何断开与前一节的页眉链?

    2005-04-21 怎么和男生聊天才能一直有的聊??首先声 1. 聊天时点上烛光或用红纱巾把灯罩蒙胧住,这招在电影<有话好好说>里用过. 2. 到鲜花店预约,请送花者于晚7点在你和他(她 ...

  9. python学习: 如何循序渐进学习Python语言

    大家都知道Python语言是一种新兴的编程语言.1989年,Python就由Guido van Rossum发明.Python一直发展态势很好. 原因有几点:1.跨平台性好.Linux.Windows ...

最新文章

  1. [实战]MVC5+EF6+MySql企业网盘实战(15)——逻辑重构2
  2. 拼音开头有什么字_语文基础 孩子刚上一年级学习拼音太难了?家长在家这样教真不比老师差!...
  3. 花旗看好互联网板块 力荐Facebook等5支网络股
  4. c++远征之模板篇——函数模板、类模板
  5. 学习Python不需要程基础?
  6. 收藏 | 小目标检测的一些问题,思路和方案
  7. [Hibernate]关于ID的一个容易混淆的地方
  8. 黑客攻防技术宝典Web实战篇第2版—第6章 攻击验证机制
  9. php生成饼状图 柱形图,求一个饼状图或柱状图php生成类或例子
  10. 医学专业失业率最高 三类相关行业人才紧缺
  11. 默认conf指向位置
  12. 北广传媒RTMP流媒体服务器漏洞
  13. linux离线依赖包一键安装包,【分享】一键离线安装PetaLinux依赖包
  14. AllenNLP 用法总结
  15. paddlex,2.1.0识别预测代码(包含视频的)
  16. android自动刷广告软件是,自动刷视频挂机下载-自动刷视频软件下载1.0安卓版-西西软件下载...
  17. java根据银行卡前几位判断所属银行,个别银行可自定义,如最后的长沙银行
  18. 《乌云背后的幸福线》
  19. 输入一个字符串,字符串长度大于6,让黄灯长亮,否则一直闪烁
  20. ergonomic计算机专业英语,[听单词] 计算机专业英语词汇音频52,计算机英语单词MP3...

热门文章

  1. 这样讲闭包,你终生难忘
  2. org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset!
  3. RHEL7 -- NetworkManager
  4. mysql 数据表中查找重复记录
  5. 好的技术文章应该让读者更自信而不是更自卑
  6. 怎样上传php文件到云服务器地址,php文件怎么导入到云服务器
  7. c语言 怎么访问64位地址_大神用10000字总结了嵌入式C语言必学知识点……
  8. 8年软件测试工程师感悟:与薪资相匹配的永远是实力
  9. labelImg(pyqt4 )出现错误(segmentation fault(core dumped) )
  10. 文件或目录损坏无法读取