Python eval() 函式


eval() 方法會解析傳遞給它的表示式,並在程式內部執行該表示式。換句話說,它將字串解釋為 Python 程式內的程式碼。

語法

eval 的語法如下:

eval(expression, globals=None, locals=None)

其中

  • 表示式 - 傳遞給方法的 Python 表示式。

  • globals - 可用全域性方法和變數的字典。

  • locals - 可用區域性方法和變數的字典。

在下面的示例中,我們允許使用者建立表示式並執行 Python 程式來評估該表示式。因此,它有助於建立動態程式碼。

示例

 線上演示

# expression to be evaluated
user_expr = raw_input("Enter an expression in terms of variable a):")
#nter the value of variable
a = int(raw_input("Enter the value of a:"))
# evaluate the expression
result = eval(user_expr)
# printing evaluated result
print("Result = {}".format(result))

輸出

執行以上程式碼將得到以下結果:

Enter an expression in terms of variable a):a*(a-3)+a^2
Enter the value of a:7
Result = 33

eval() 的安全問題

對於涉及 Web 應用程式或桌面程式的程式,使用 eval() 方法可能會產生安全漏洞,因為使用該程式的人員可能會提供表示式,這些表示式是系統命令,用於刪除檔案或獲取系統中的敏感資料。為了防止這種情況,我們可以將 eval() 函式限制為某些選定的函式或變數。

防止這些漏洞的步驟如下:

在 eval() 方法中省略區域性和全域性變數。

這樣,它將只在當前作用域中進行評估,而不會找到此作用域之外的其他變數。

僅省略區域性引數

省略區域性變數後,所有變數的作用域都將作為全域性變數。接下來,我們將一個空字典作為全域性變數傳遞,這允許僅內建變數可用,即使我們已將其他庫匯入到程式中。

示例

 線上演示

from time import *
print(eval('dir()', {}))

執行以上程式碼將得到以下結果:

['__builtins__']

接下來,我們還可以允許從匯入的庫中僅使用某些方法。

 線上演示

from time import *
print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))

輸出

執行以上程式碼將得到以下結果:

['Localtime', '__builtins__', 'sleeptime']

將選定的函式傳遞給全域性和區域性

我們還可以透過不允許任何內建函式,並且僅允許從本地匯入的庫中的一些函式來限制函式在全域性和區域性作用域中的可用性。在下面的示例中,我們僅使 time 庫中的 gmtime 方法可用。

示例

 線上演示

from time import *
a = 1445945763
print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))

輸出

執行以上程式碼將得到以下結果:

time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)

更新於:2019年8月23日

579 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.