Python 中的 eval() 函式
Hiten Kanwar
2023年1月3日
2021年10月2日
Python 是一種解釋性的高階程式語言。它具有清晰的程式碼結構和可讀性以及明顯的顯著縮排。
eval()
函式解析表示式引數,然後將其計算為 Python 表示式。
下面提供了 eval()
函式的語法。
eval (expression, [globals[, locals]])
返回值將基於並且將是評估表示式的結果。
我們在下面的例子中評估了一個簡單的加法。
x = 2
eval('x+5')
輸出:
7
eval()
函式引數是一個字串以及 globals
和 locals
的可選引數。如果提供了 globals
,它必須是一個字典。locals
可以是任何對映物件。
假設提供了 globals
字典,但沒有提供鍵的值。生成對內建模組 builtins
字典的引用,並在表示式開始解析之前插入到關鍵部分下。
這粗略地表明該表示式通常可以完全訪問標準的 builtins
模組。如果未提供 locals
物件,則預設為全域性字典。此外,在兩個字典都被省略的情況下,表示式確實在呼叫函式 eval()
的環境中使用 globals
和 locals
執行。
builtins
模組中存在某些可能會嚴重損壞系統的功能。但是當然可以阻止任何可能可疑的內容。
例如,考慮建立一個表示系統內可用核心數量的列表的示例。
from os import cpu_count
eval('[1, cpu_count()]')
輸出:
[1, 8]
注意
由於這個函式把每一個字串都當作程式碼來評估,因此在使用它時必須非常小心。有人可能會使用它作為安全漏洞在計算機上執行程式碼。例如,
eval(input())
將要求使用者輸入字串並將其作為程式碼執行。如果匯入 os
模組,你可以在裝置上執行各種操作,例如刪除檔案和篡改系統。