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'\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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM