[英]Python built-in function “compile”. What is it used for?
我今天遇到了一個內置函數compile
。 雖然我閱讀了文檔,但仍然不了解它的用法或適用位置。 請任何人以示例方式解釋此功能的用法。 我將非常感謝示例。
在文檔中,該函數采用一些參數,如下所示。
compile(source, filename, mode[, flags[, dont_inherit]])
它不是那么常用。 當您具有字符串形式的Python源代碼並且想要將其變成可以保留和使用的Python代碼對象時,將使用它。 這是一個簡單的例子:
>>> codeobj = compile('x = 2\nprint "X is", x', 'fakemodule', 'exec')
>>> exec(codeobj)
X is 2
基本上,代碼對象將字符串轉換為對象,以后您可以調用exec
來運行字符串中的源代碼。 (這是針對“ exec”模式的;如果字符串包含單個表達式的代碼,則“ eval”模式允許使用eval
。)這不是一項常見的任務,這就是為什么您永遠不會遇到需要它的原因。
它的主要用途是在元編程或嵌入情況下。 例如,如果您有一個Python程序,該程序允許用戶使用自定義Python代碼編寫其行為腳本,則可以使用compile
和exec
來存儲和執行這些用戶定義的腳本。
很少使用compile
另一個原因是,像exec
, eval
和它們的同類一樣, compile
是潛在的安全漏洞。 如果您以字符串形式獲取用戶代碼並進行編譯,然后再執行它,則可能正在運行不安全的代碼。 (例如,假設在我上面的示例中,代碼是formatYourHardDrive()
而不是print x
。)
compile
是exec
和eval
的較低版本。 它不會執行或評估您的語句或表達式,但會返回可以執行此操作的代碼對象。 模式如下:
compile(string, '', 'eval')
返回如果完成eval(string)
將會執行的代碼對象。 請注意,您不能在這種模式下使用語句。 僅(單個)表達式有效。 用於單個表達式。 compile(string, '', 'exec')
返回如果執行完exec(string)
后將要執行的代碼對象。 您可以在此處使用任意數量的語句。 用於整個模塊。 compile(string, '', 'single')
類似於exec
模式,但是它將忽略除第一條語句以外的所有內容。 請注意,帶有結果的if
/ else
語句被視為單個語句。 用於一個語句。 看看那個文檔 。 在http://joequery.me/code/python-builtin-functions/#compile上也有一個很棒的解釋(很好,很簡單),其中有一個很好的用法示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.