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

    这个函数用来编译一段字符串的源码,结果可以生成字节码或者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')  # 编译为表达式
    
    code_str = '''print 'olivetree'
    print 'olivetree123' '''
    c = compile(code_str, '<string>', 'exec')
    exec c
    c = compile(code_str, '<string>', 'single')
    exec c
    code_str = '''1+1 '''
    c = compile(code_str, '<string>', 'eval')
    x = eval(c)
    print x
    

     输出:

    olivetree
    olivetree123
    olivetree
    2

    原文:http://blog.csdn.net/caimouse/article/details/41049949

     

  • 相关阅读:
    hdu 5366 简单递推
    hdu 5365 判断正方形
    hdu 3635 并查集
    hdu 4497 数论
    hdu5419 Victor and Toys
    hdu5426 Rikka with Game
    poj2074 Line of Sight
    hdu5425 Rikka with Tree II
    hdu5424 Rikka with Graph II
    poj1009 Edge Detection
  • 原文地址:https://www.cnblogs.com/olivetree123/p/4704007.html
Copyright © 2011-2022 走看看