zoukankan      html  css  js  c++  java
  • python 内置函数 compile()

    python 内置函数 compile()

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

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

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

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

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

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

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

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

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

     1 a = '''name = input("请输入:")'''
     2 
     3 t = compile(a,'','single') #编译为交互式模式 ' ' filename,不从文件读取,也得写个空字符串
     4 exec(t)
     5 print(name) #name会报警,不用管
     6  #compile()  
     7 str = "for i in range(0,10): print(i)"  
     8 c = compile(str,'','exec')   # 编译为字节代码对象  
     9 exec(c)                          # 执行  
    10 输出:
    11 0
    12 1
    13 2
    14 3
    15 4
    16 5
    17 6
    18 7
    19 8
    20 9
    21    
    22 str2 = "3*x + 4*y"  
    23 c2 = compile(str2, '', 'eval')  # 编译为表达式 

    • source -- 字符串或者AST(Abstract Syntax Trees)对象。。
    • filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
    • mode -- 指定编译代码的种类。可以指定为 exec, eval, single。
    • flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。
    • flags和dont_inherit是用来控制编译源码时的标志

     

  • 相关阅读:
    富文本的一般处理方式,document.getElementById('富文本的ID').contentWindow.document.body.innerHTML = '%s'" %(content)
    本地搭建Jenkins
    if __name__ == '__main__'是什么意思?如何理解?看到一个很有用的解答
    关于执行webdriver.Chrome; 报错WebDriverException: Message: unknown error: Element is not clickable at point (1085, 103)
    【转载】学习总结——接口测试基础
    fiddler使用——配置抓取https,出现提示“禁用解密”“单击配置”
    算法(二叉树-矩阵-堆排序)
    算法(递归)---写的很乱
    ES6高级技巧(二)
    ES6高级使用技巧(reduce,filter篇)
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/7822358.html
Copyright © 2011-2022 走看看