標籤:
這個函數用來編譯一段字串的源碼,結果可以產生位元組碼或者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 cc = compile(code_str, ‘<string>‘, ‘single‘)exec ccode_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
python 內建函數 : compile()