主页 > Python函数 > 正文

python函数每日一讲 - eval函数

函数界说:

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

将字符串str当成有用的表达式来求值并回来计算成果。globals和locals参数是可选的,假如供给了globals参数,那么它有必要是dictionary类型;假如供给了locals参数,那么它可所以恣意的map目标。

python的大局姓名空间存储在一个叫globals()的dict目标中;部分姓名空间存储在一个叫locals()的dict目标中。咱们能够用print (locals())来查看该函数体内的一切变量名和变量值。

Python版别兼容:

Python2.7

Python3.x

eval()首要效果:

1)在编译言语里要动态地发生代码,基本上是不可能的,但动态言语是能够,意味着软件现已布置到服务器上了,但只需作很少的更改,只好直接修正这部分的代码,就可当即完成改变,不必整个软件从头加载。

2)在machin learning里依据用户运用这个软件频率,以及办法,可动态地修正代码,习惯用户的改变。

英文解说:

The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.


The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__’, the current globals are copied into globals before expression is parsed. This means that expression normally has full access to the standard builtins module and restricted environments are propagated. If the locals dictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:


比如:

a=1
g={'a':20}
eval("a+1",g)

成果:

21


比如2, 测验globals, locals

x = 1
y = 1
num1 = eval("x+y")
print (num1)
def g():    
    x = 2    
    y = 2  
    num3 = eval("x+y")    
    print (num3)        
    num2 = eval("x+y",globals())   
    #num2 = eval("x+y",globals(),locals())    
    print (num2)
    
g()

num1的值是2;num3的值也很好了解,是4;num2的值呢?由于供给了globals()参数,那么首要应当找大局的x和y值,也便是都为1,那么清楚明了,num2的值也是2。假如注释掉该句,履行下面一句呢?依据第3)点可知,成果为4


安全问题:

由于eval的特型, 很可能被黑客运用,形成安全问题。

怎样防止安全问题?

1、自行写查看函数;

2、运用ast.literal_eval替代


上一篇:python函数每日一讲 - enumerate函数
下一篇:python函数每日一讲 - exec履行函数

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854