在本教程中,我們將借助示例了解 Python eval() 方法。
eval()
方法解析傳遞給該方法的表達式並在程序中運行 python 表達式(代碼)。
示例
number = 9
# eval performs the multiplication passed as argument
square_number = eval('number * number')
print(square_number)
# Output: 81
eval() 語法
用法:
eval(expression, globals=None, locals=None)
參數:
eval()
函數采用三個參數:
- expression- 作為 Python 表達式解析和評估的字符串
- globals(可選) - 字典
- locals(可選)- 一個映射對象。字典是 Python 中標準且常用的映射類型。
globals
和locals
的使用將在本文後麵討論。
返回:
eval()
方法返回從 expression
評估的結果。
示例 1:eval() 如何在 Python 中工作
x = 1
print(eval('x + 1'))
輸出
2
在這裏,eval()
函數計算表達式 x + 1
並且 print
用於顯示該值。
示例 2:演示使用 eval() 的實際示例
# Perimeter of Square
def calculatePerimeter(l):
return 4*l
# Area of Square
def calculateArea(l):
return l*l
expression = input("Type a function: ")
for l in range(1, 5):
if (expression == 'calculatePerimeter(l)'):
print("If length is ", l, ", Perimeter = ", eval(expression))
elif (expression == 'calculateArea(l)'):
print("If length is ", l, ", Area = ", eval(expression))
else:
print('Wrong Function')
break
輸出
Type a function: calculateArea(l) If length is 1 , Area = 1 If length is 2 , Area = 4 If length is 3 , Area = 9 If length is 4 , Area = 16
使用 eval() 時的警告
考慮使用 Unix 係統(macOS、Linux 等)並且您已導入 os
模塊的情況。 os 模塊提供了一種可移植的方式來使用操作係統函數,例如讀取或寫入文件。
如果您允許用戶使用 eval(input())
輸入值,則用戶可以使用以下命令發出命令來更改文件甚至刪除所有文件: os.system('rm -rf *')
。
如果您在代碼中使用eval(input())
,最好檢查用戶可以使用哪些變量和方法。您可以使用 dir() method 查看哪些變量和方法可用。
from math import *
print(eval('dir()'))
輸出
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'os', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
限製 eval() 中可用方法和變量的使用
通常情況下,expression
(eval()
的第一個參數)中使用的所有可用方法和變量可能都不需要,甚至可能存在安全漏洞。您可能需要限製對 eval()
使用這些方法和變量。您可以通過將可選的 globals
和 locals
參數(字典)傳遞給 eval()
函數來實現。
1.當globals和locals參數都省略時
如果兩個參數都被省略(如我們之前的示例中),則 expression
在當前範圍內執行。您可以使用以下代碼檢查可用的變量和方法:
print(eval('dir()')
2.傳遞globals參數; locals 參數被省略
globals
和locals
參數(字典)分別用於全局和局部變量。如果省略locals
字典,則默認為globals
字典。意思是,globals
將用於全局和局部變量。
注意:您可以使用 Python 檢查當前的全局和本地字典globals和locals內置方法分別。
示例 3:將空字典作為全局參數傳遞
from math import *
print(eval('dir()', {}))
# The code will raise an exception
print(eval('sqrt(25)', {}))
輸出
['__builtins__'] Traceback (most recent call last): File "<string>", line 5, in <module> print(eval('sqrt(25)', {})) File "<string>", line 1, in <module> NameError: name 'sqrt' is not defined
如果您將空字典作為 globals
傳遞,則隻有 __builtins__
可用於 expression
(eval()
的第一個參數)。
即使我們在上述程序中導入了math
模塊,expression
也無法訪問 math module 提供的任何函數。
示例 4:使某些方法可用
from math import *
print(eval('dir()', {'sqrt': sqrt, 'pow': pow}))
輸出
['__builtins__', 'pow', 'sqrt']
在這裏,表達式隻能使用 sqrt()
和 pow()
方法以及 __builtins__
。
也可以根據您的意願更改 expression
可用方法的名稱:
from math import *
names = {'square_root': sqrt, 'power': pow}
print(eval('dir()', names))
# Using square_root in Expression
print(eval('square_root(9)', names))
輸出
['__builtins__', 'power', 'square_root'] 3.0
在上述程序中,square_root()
使用 sqrt()
計算平方根。但是,嘗試直接使用sqrt()
會引發錯誤。
示例 5:限製使用 內置s
您可以限製在expression
中使用__builtins__
,如下所示:
eval(expression, {'__builtins__': None})
3. 傳遞全局和局部字典
您可以通過傳遞locals
字典使所需的函數和變量可供使用。例如:
from math import *
a = 169
print(eval('sqrt(a)', {'__builtins__': None}, {'a': a, 'sqrt': sqrt}))
輸出
13.0
在這個程序中,expression
隻能有sqrt()
方法和變量a
。所有其他方法和變量均不可用。
通過傳遞globals
和locals
字典來限製eval()
的使用將使您的代碼安全,特別是當您使用用戶向eval()
方法提供的輸入時。
注意:有時,eval()
即使名稱有限,也不安全。當一個對象及其方法可以訪問時,幾乎可以做任何事情。唯一安全的方法是驗證用戶輸入。
相關用法
- Python PIL eval()用法及代碼示例
- Python Wand evaluate()用法及代碼示例
- Python numpy matrix eye()用法及代碼示例
- Python enchant.request_dict()用法及代碼示例
- Python enum.IntEnum用法及代碼示例
- Python math expm1()用法及代碼示例
- Python enchant.get_enchant_version()用法及代碼示例
- Python emoji轉text用法及代碼示例
- Python enchant.request_pwl_dict()用法及代碼示例
- Python exponential轉float用法及代碼示例
- Python enchant.Dict()用法及代碼示例
- Python enum.auto()用法及代碼示例
- Python enchant.list_languages()用法及代碼示例
- Python expandtabs()用法及代碼示例
- Python enumerate()用法及代碼示例
- Python enchant.DictWithPWL()用法及代碼示例
- Python exec()用法及代碼示例
- Python enchant.dict_exists()用法及代碼示例
- Python math exp()用法及代碼示例
- Python numpy matrix empty()用法及代碼示例
注:本文由純淨天空篩選整理自 Python eval()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。