Python eval() 函数


eval() 方法会解析传递给它的表达式,并在程序内部运行该表达式。换句话说,它将字符串解释为 Python 程序内的代码。

语法

eval 的语法如下:

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

其中

  • 表达式 - 传递给方法的 Python 表达式。

  • globals - 可用全局方法和变量的字典。

  • locals - 可用局部方法和变量的字典。

在下面的示例中,我们允许用户创建表达式并运行 Python 程序来评估该表达式。因此,它有助于创建动态代码。

示例

 在线演示

# expression to be evaluated
user_expr = raw_input("Enter an expression in terms of variable a):")
#nter the value of variable
a = int(raw_input("Enter the value of a:"))
# evaluate the expression
result = eval(user_expr)
# printing evaluated result
print("Result = {}".format(result))

输出

运行以上代码将得到以下结果:

Enter an expression in terms of variable a):a*(a-3)+a^2
Enter the value of a:7
Result = 33

eval() 的安全问题

对于涉及 Web 应用程序或桌面程序的程序,使用 eval() 方法可能会产生安全漏洞,因为使用该程序的人员可能会提供表达式,这些表达式是系统命令,用于删除文件或获取系统中的敏感数据。为了防止这种情况,我们可以将 eval() 函数限制为某些选定的函数或变量。

防止这些漏洞的步骤如下:

在 eval() 方法中省略局部和全局变量。

这样,它将只在当前作用域中进行评估,而不会找到此作用域之外的其他变量。

仅省略局部参数

省略局部变量后,所有变量的作用域都将作为全局变量。接下来,我们将一个空字典作为全局变量传递,这允许仅内置变量可用,即使我们已将其他库导入到程序中。

示例

 在线演示

from time import *
print(eval('dir()', {}))

运行以上代码将得到以下结果:

['__builtins__']

接下来,我们还可以允许从导入的库中仅使用某些方法。

 在线演示

from time import *
print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))

输出

运行以上代码将得到以下结果:

['Localtime', '__builtins__', 'sleeptime']

将选定的函数传递给全局和局部

我们还可以通过不允许任何内置函数,并且仅允许从本地导入的库中的一些函数来限制函数在全局和局部作用域中的可用性。在下面的示例中,我们仅使 time 库中的 gmtime 方法可用。

示例

 在线演示

from time import *
a = 1445945763
print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))

输出

运行以上代码将得到以下结果:

time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)

更新于:2019年8月23日

579 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告