Python 中的 eval() 函式

Hiten Kanwar 2023年1月3日 2021年10月2日
Python 中的 eval() 函式

Python 是一種解釋性的高階程式語言。它具有清晰的程式碼結構和可讀性以及明顯的顯著縮排。

eval() 函式解析表示式引數,然後將其計算為 Python 表示式。

下面提供了 eval() 函式的語法。

eval (expression, [globals[, locals]])

返回值將基於並且將是評估表示式的結果。

我們在下面的例子中評估了一個簡單的加法。

x = 2
eval('x+5')

輸出:

7

eval() 函式引數是一個字串以及 globalslocals 的可選引數。如果提供了 globals,它必須是一個字典。locals 可以是任何對映物件。

假設提供了 globals 字典,但沒有提供鍵的值。生成對內建模組 builtins 字典的引用,並在表示式開始解析之前插入到關鍵部分下。

這粗略地表明該表示式通常可以完全訪問標準的 builtins 模組。如果未提供 locals 物件,則預設為全域性字典。此外,在兩個字典都被省略的情況下,表示式確實在呼叫函式 eval() 的環境中使用 globalslocals 執行。

builtins 模組中存在某些可能會嚴重損壞系統的功能。但是當然可以阻止任何可能可疑的內容。

例如,考慮建立一個表示系統內可用核心數量的列表的示例。

from os import cpu_count
eval('[1, cpu_count()]')

輸出:

[1, 8]
注意
由於這個函式把每一個字串都當作程式碼來評估,因此在使用它時必須非常小心。有人可能會使用它作為安全漏洞在計算機上執行程式碼。例如,eval(input()) 將要求使用者輸入字串並將其作為程式碼執行。如果匯入 os 模組,你可以在裝置上執行各種操作,例如刪除檔案和篡改系統。