eval是Python的内置函数,其功能是返回传入字符串的表达式结果。想象变量赋值时,将等号右侧的表达式写入
在字符串的格式中,这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。
eval函数在python中的使用非常灵活,但也非常危险,安全性是其缺点。本文从灵活性和危险性两个方面介绍了eval。
1、强大之处
举几个例子来感受一下字符串和list、tuple、dict的转换。
a="[1,2],[3,4],[5,6],[7,8],[9,0]" b=eval(a) b Out[3]:[1,2],[3,4],[5,6],[7,8],[9,0] type(b) Out[4]:list a="{1:'a',2:'b'}" b=eval(a) b Out[7]:{1:'a',2:'b'} type(b) Out[8]:dict a="[1,2],[3,4],[5,6],[7,8],(9,0)" b=eval(a) b Out[11]:[1,2],[3,4],[5,6],[7,8],(9,0)
强大,给eval一个字符串,eval给你一个表达式返回值。
eval的语法格式如下:
eval(expression[,globals[,locals]])
expression : 字符串
globals : 变量作用域,整体命名空间,如果提供,必须是字典对象。
locals : 变量作用域,局部命名空间,如果提供,可以是任何映射对象。
结合globals和locals看几个例子
Globals参数值的传输{age”:1822},
eval("{'name':'linux','age':age}",{"age":1822})
输出结果
{‘name':‘linux',‘age':1822}
再加上locals变量
age=18 eval("{'name':'linux','age':age}",{"age":1822},locals())
从以上两个例子可以看出,当locals参数空,globals参数不空时,查找globals参数中是否存在变量并计算。
当两个参数都不是空的时候,先找locals参数,再找globals参数。locals参数中的同名变量将覆盖globals中的变量。
2、危险之处
虽然eval很方便,但要注意安全。您可以将字符串转换为表达式并执行,您可以使用执行系统命令删除文件和其他操作。
假设用户恶意输入。例如:
eval("__import__('os').system('ls /home/pythontab.com/www/')")
然后在eval()之后,你会发现当前的文件夹文件将展示在用户面前。这句话实际上相当于执行
os.system('ls /home/pythontab.com/www/')
然后继续输入:
eval("__import__('os').system('cat /home/pythontab.com/www/test.sql')")
所有的代码都给人看。
另一个删除命令,文件消失。例如
eval("__import__('os').system('rm /home/pythontab.com/www/test.data')")
因此,使用eval,一方面要享受他的灵活性,同时也要注意安全。