Python eval的用法及留意事项

eval是Python的一个内置函数,这个函数的效果是,回来传入字符串的表达式的成果。幻想一下变量赋值时,将等号右边的表达式写成字符串的格局,将这个字符串作为eval的参数,eval的回来值便是这个表达式的成果。

python中eval函数的用法非常的灵敏,但也非常风险,安全性是其最大的缺陷。本文从灵敏性和风险性两方面介绍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/vztug.com/www/')")

那么eval()之后,你会发现,当时文件夹文件都会议现在用户前面。这句其实相当于履行了


os.system('ls /home/vztug.com/www/')

那么持续输入:

eval("__import__('os').system('cat /home/vztug.com/www/test.sql')")

代码都给人看了。

再来一条删去指令,文件消失。比方

eval("__import__('os').system('rm /home/vztug.com/www/test.data')")

所以运用eval,一方面享用他的了灵敏性一起,也要留意安全性。


上一篇:Python中__new__和__init__的差异与联络
下一篇:Python3中_和__的用处和差异

PythonTab微信大众号:

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

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854