在 Python 中,eval()是一个内置函数,用于将一个字符串作为 Python 表达式执行,并返回表达式的结果。

eval() 函数语法

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

参数:

  • expression:表示要执行的 Python 表达式;
  • globalslocals:可选参数,用于指定全局命名空间和本地命名空间;如果省略这两个参数,则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)