這個函數用來編譯一段字符串的源碼,結果可以生成字節碼或者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模式時,不需要在每個行后面輸入換行符;在這個版本之后增加了優化參數。
#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'\nprint '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