首頁  >  文章  >  後端開發  >  Python內建函數—compile

Python內建函數—compile

黄舟
黄舟原創
2017-01-19 16:42:372229瀏覽

Python內建函數-compile

compilecompile(source, filename, mode[, flags[, dont_inherit,[optimize]]])
1.這個函數用來編譯一段字串的來源碼,結果可以產生字元碼或AST(抽象語法樹),
字節碼可以使用函數exec()來執行,而AST可以使用eval()來繼續編譯。
2.參數source是一串字串的源碼,或是AST物件數組。
3.參數filename是讀取字串的檔案對象,
如果不是從檔案裡讀取原始碼來編譯,那麼這裡可以放一些用來識別這些程式碼的字串。
4.參數mode是用來指明那種表示的源碼類型;
   如果是exec類型,表示這是一個序列語句,可以進行運行;
   如果是eval類型,表示這是一個單一的表達式語句,可以用來計算對應的值出來;
   如果是single類型,表示這是單一語句,採用交互模式執行,
   在這種情況下,如果是一個表達式,一般會輸出結果,而不是打印為None輸出。
5.可選參數flags和dont_inherit是用來控制編譯原始碼時的標誌,
可以查看PEP236文件來了解這些參數,以及相關編譯的說明。
如果兩者使用缺省參數(也即兩者都是零值),
在呼叫本函數編譯時,主要使用程式碼中指明的編譯特徵來對待;
如果flags參數設定有值,而dont_inherit沒有設定(即是零值),
那麼編譯程式碼時,不僅原始碼的編譯特徵起作用,而且flags指明的特徵也起作用,相當兩者的並集;
如果參數dont_inherit設定有值(即是非零值) ,
編譯語句時只有參數flags所指明的編譯特徵值在起作用,也就是不使用原始碼裡所指明的特徵。
編譯特徵是按位圖的方式設定到參數裡,可以查看__future__。
6.可選參數optimize是用來指明編譯器使用最佳化的等級;
缺省值為-1,表示使用命令列參數-O中所取得的最佳化等級為準;
如果設定值為0(即是不用最佳化,__debug__是設定true),是沒有最佳化;
如果設定值為1,assert語句被刪除,__debug__設定為false;
如果設定值為2,除了設定值為1的功能之外,還會把程式碼裡文檔說明也刪除掉,達到最佳最佳化結果。
7.當本函數編譯程式碼時,如果語法出錯會傳回SyntaxError;
如果程式碼包含一些空字節,則傳回型別錯誤TypeError。
注意事項:
1.當採用single或eval類型編譯時,
如果有多行程式碼,每行程式碼後面至少有一個換行符,否則在code模組編譯時就會提示編譯的原始碼不完整錯誤。
在Python 3.2版本之後,允許輸入Windows或Mac的換行符;
2.當採用exec模式時,不需要在每個行後面輸入換行符;在這個版本之後增加了優化參數。

In [16]: str = "for i in range(10): print(i)"
In [17]: c = compile(str,'','exec') #编译为字节代码对象
In [18]: exec(c)
0
1
2
3
4
5
6
7
8
9
In [19]: str = "3*x + 4*y"
In [20]: c = compile(str,'','eval') #编译为表达式
In [23]: x,y = 3,4
In [24]: eval(c)
Out[24]: 25

以上就是Python內建函數-compile的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn