Python中的eval

Python eval()函数 解析表达式参数,将其作为python表达式进行计算,并在程序中运行python表达式(代码)。

null

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主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享