簡體   English   中英

Python內置函數“編譯”。 它是干什么用的?

[英]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代碼編寫其行為腳本,則可以使用compileexec來存儲和執行這些用戶定義的腳本。

很少使用compile另一個原因是,像execeval和它們的同類一樣, compile是潛在的安全漏洞。 如果您以字符串形式獲取用戶代碼並進行編譯,然后再執行它,則可能正在運行不安全的代碼。 (例如,假設在我上面的示例中,代碼是formatYourHardDrive()而不是print x 。)

compileexeceval的較低版本。 它不會執行或評估您的語句或表達式,但會返回可以執行此操作的代碼對象。 模式如下:

  1. compile(string, '', 'eval')返回如果完成eval(string)將會執行的代碼對象。 請注意,您不能在這種模式下使用語句。 僅(單個)表達式有效。 用於單個表達式。
  2. compile(string, '', 'exec')返回如果執行完exec(string)后將要執行的代碼對象。 您可以在此處使用任意數量的語句。 用於整個模塊。
  3. compile(string, '', 'single')類似於exec模式,但是它將忽略除第一條語句以外的所有內容。 請注意,帶有結果的if / else語句被視為單個語句。 用於一個語句。

看看那個文檔 http://joequery.me/code/python-builtin-functions/#compile上也有一個很棒的解釋(很好,很簡單),其中有一個很好的用法示例。

您具體不了解什么? 該文檔說明它將:

將源編譯為代碼或AST對象。 代碼對象可以通過exec語句執行,也可以通過調用eval()進行eval() 源可以是Unicode字符串,Latin-1編碼的字符串或AST對象。 有關如何使用AST對象的信息,請參閱ast模塊文檔。

因此,它需要python代碼,並返回這兩件事

  • exec將執行python代碼
  • eval將計算一個表達式,其功能不如exec
  • ast允許您瀏覽代碼生成的抽象語法樹

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM