Python 的內置函數 compile() 用於將源代碼編譯為可執行的代碼對象或抽象語法樹(AST)。該函數可以將字符串形式的 Python 代碼編譯為字節碼,以便後續通過 exec() 或 eval() 函數執行。
函數簽名
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
參數説明
- source:需要編譯的源代碼,可以是字符串、字節串或 AST 對象。
- filename:指定源代碼的文件名。如果代碼不是從文件中讀取的,可以傳入一個可識別的名稱(如
<string>)。 -
mode:指定編譯模式,有以下三種:
'exec':編譯多行代碼,適合模塊或腳本。'eval':編譯單個表達式,返回一個結果。'single':編譯單行交互式代碼,類似 Python 交互式環境。
- flags(可選):控制編譯行為的標誌,如
ast.PyCF_ONLY_AST表示只生成 AST。 - dont_inherit(可選):若為
True,編譯時不繼承當前作用域的__future__特性。 - optimize(可選):優化級別(
-1、0、1或2),-1表示使用解釋器的默認優化。
返回值
返回一個代碼對象(code object),可以傳遞給 exec() 或 eval() 執行。
示例
1. 使用 'exec' 模式編譯多行代碼
code = """
def greet(name):
print(f"Hello, {name}!")
greet("World")
"""
compiled = compile(code, "<string>", "exec")
exec(compiled) # 輸出: Hello, World!
2. 使用 'eval' 模式編譯表達式
expr = "3 + 5 * 2"
compiled = compile(expr, "<string>", "eval")
result = eval(compiled) # result = 13
3. 使用 'single' 模式編譯交互式代碼
line = "print('Welcome to Python!')"
compiled = compile(line, "<string>", "single")
exec(compiled) # 輸出: Welcome to Python!
應用場景
- 動態代碼執行:從文件或用户輸入中讀取代碼並執行。
- 代碼生成:在運行時生成 Python 代碼並編譯運行。
- 性能優化:預編譯頻繁使用的代碼以減少重複解析開銷。
注意事項
- 如果源代碼語法錯誤,
compile()會拋出SyntaxError。 - 避免直接編譯不可信的輸入,以防代碼注入攻擊。
通過 compile() 函數,可以實現靈活的代碼動態處理,但需謹慎使用以確保安全性。