Python eval()函数 解析表达式参数,将其作为python表达式进行计算,并在程序中运行python表达式(代码)。
Python eval()语法
eval(表达式,全局=None,局部=None)
Python eval()参数
- 表达方式: 该字符串作为Python表达式进行分析和计算
- 全局(可选): 用于指定可用全局方法和变量的字典。
- 本地人(可选): 另一个字典指定可用的局部方法和变量。
Python eval()示例
示例1:演示eval()用法的示例
让我们借助一个简单的Python程序来探索它。 函数创建器 是一个函数,用于计算用户创建的数学函数。
Python3
from math import * def secret_function(): return "Secret key is 1234" def function_creator(): # expression to be evaluated expr = input ( "Enter the function(in terms of x):" ) # variable used in expression x = int ( input ( "Enter the value of x:" )) # evaluating expression y = eval (expr) # printing evaluated result print ( "y = {}" . format (y)) if __name__ = = "__main__" : function_creator() |
输出:
Enter the function(in terms of x):x*(x+1)*(x+2)Enter the value of x:3y = 60
让我们稍微分析一下代码:
- 上述函数接受变量中的任何表达式 十、 作为输入。
- 然后用户必须输入一个值 十、 .
- 最后,我们使用 eval() 通过传递 expr 作为论据。
示例2:使用eval函数的数学运算
Python3
evaluate = 'x*(x+1)*(x+2)' print (evaluate) print ( type (evaluate)) x = 3 print ( type (x)) expression = eval (evaluate) print (expression) print ( type (expression)) |
x*(x+1)*(x+2)<class 'str'><class 'int'>60<class 'int'>
eval的漏洞问题
我们当前版本的 函数创建器 有一些漏洞。用户可以很容易地暴露程序中隐藏的值,或者调用一个危险的函数,因为eval将执行传递给它的任何内容。
例如,如果您这样输入:
Enter the function(in terms of x):secret_function()Enter the value of x:0
您将获得以下输出:
y = Secret key is 1234
另外,考虑导入的情况。 操作系统 python程序中的模块。操作系统模块提供了一种使用操作系统功能(如读取或写入文件)的便携方式。一个命令可以删除系统中的所有文件。当然,在大多数情况下(比如桌面程序),用户不能做更多的事情,就像编写自己的python脚本一样,但在某些应用程序中(比如web应用程序、kiosk计算机),这可能是一个风险!
解决办法是限制 评估 只提供我们想要的函数和变量。
确保评估安全
评估 函数具有显式传递它可以访问的函数或变量列表的功能。我们需要以字典的形式将其作为参数传递。
Python3
from math import * def secret_function(): return "Secret key is 1234" def function_creator(): # expression to be evaluated expr = input ( "Enter the function(in terms of x):" ) # variable used in expression x = int ( input ( "Enter the value of x:" )) # passing variable x in safe dictionary safe_dict[ 'x' ] = x # evaluating expression y = eval (expr, { "__builtins__" : None }, safe_dict) # printing evaluated result print ( "y = {}" . format (y)) if __name__ = = "__main__" : # list of safe methods safe_list = [ 'acos' , 'asin' , 'atan' , 'atan2' , 'ceil' , 'cos' , 'cosh' , 'degrees' , 'e' , 'exp' , 'fabs' , 'floor' , 'fmod' , 'frexp' , 'hypot' , 'ldexp' , 'log' , 'log10' , 'modf' , 'pi' , 'pow' , 'radians' , 'sin' , 'sinh' , 'sqrt' , 'tan' , 'tanh' ] # creating a dictionary of safe methods safe_dict = dict ([(k, locals ().get(k, None )) for k in safe_list]) function_creator() |
现在,如果我们尝试运行上述程序,比如:
Enter the function(in terms of x):secret_function()Enter the value of x:0
我们得到了输出:
NameError: name 'secret_function' is not defined
让我们一步一步地分析上面的代码:
- 首先,我们创建一个我们希望允许的方法列表 安全清单 .
- 接下来,我们创建一个安全方法字典。在这本字典里, 钥匙 方法名和 价值观 是它们的本地名称空间。
safe_dict = dict([(k, locals().get(k, None)) for k in safe_list])
- 本地人() 是一个内置方法,它返回一个字典,该字典将本地范围内的所有方法和变量与其名称空间进行映射。
safe_dict['x'] = x
这里,我们添加局部变量 十、 为了安全起见。除了 十、 将通过 评估 作用
- 评估 接受 地方的 以及 全球的 变量作为参数。因此,为了确保没有任何内置方法可用于 评估 表达式,我们将另一本字典与 安全命令 同样,如下所示:
y = eval(expr, {"__builtins__":None}, safe_dict)
因此,通过这种方式,我们取得了成功 评估 功能安全,不受任何可能的黑客攻击!
eval的用途
评估 由于我们上面探讨的安全原因,没有太多使用。
不过,在某些情况下,它还是很有用的,比如:
- 您可能希望使用它来允许用户输入自己的“scriptlet”:小表达式(甚至小函数),可用于自定义复杂系统的行为。
- eval有时也用于需要计算数学表达式的应用程序中。这比编写表达式解析器容易得多。
本博客由 尼希尔·库马尔 .如果你喜欢GeekSforgek并想投稿,你也可以使用“投稿”撰写文章。极客。组织或邮寄你的文章到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。