在 Python 中,eval()是一个内置函数,用于将一个字符串作为 Python 表达式执行,并返回表达式的结果。
eval() 函数语法
eval(expression, globals=None, locals=None)
参数:
expression:表示要执行的 Python 表达式;globals和locals:可选参数,用于指定全局命名空间和本地命名空间;如果省略这两个参数,则eval()函数在当前作用域中执行表达式;
eval()函数返回表达式的执行结果;
eval()函数只能执行单个表达式,不能执行多条语句或包含控制流的代码。如果需要执行多条语句,可以使用exec()函数。
eval() 函数示例
以下是一个使用eval()函数的示例:
x = 1
y = 2
expression = "x + y"
result = eval(expression)
print(result)
eval()函数可以执行任何合法的 Python 表达式,包括函数调用、对象属性访问等。
如果表达式包含未定义的变量、函数或者语法错误,会抛出异常;
安全性
eval()函数的参数是一个字符串,需要谨慎使用,如果字符串来自不可信的源,可能会导致安全问题;
## 危险代码!
eval('__import__("os").system("rm -rf /examples")')
这时可以使用命名空间来限制函数的使用:
x = 5 #全局变量
safe_namespace = {
'a': 1,
'b': 2,
'__builtins__': {
'sum': sum,
'abs': abs
}
}
# 使用命名空间,只允许使用 sum 和 abs 函数以及变量 a、b
result = eval('sum([a, b])', safe_namespace)
# len函数不在命名空间中,无法使用
result = eval('len([a, b])', safe_namespace)
# 无法访问全局变量 x
result = eval('sum([a, b, x])', safe_namespace)