🍀 前言
博客地址:
👋 简介
eval函数主要是用来实现python中各种数据类型与str之间的转换。字符串中包含的什么,通过eval函数就可以输出什么。比如字符串里面包含的字典就输出字典,包含的列表就输出列表,但是字符串相应的格式一定要输入正确,否则会报错。
📖 正文
1 eval函数介绍
1.1 函数的作用
计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似
1.2 函数定义
eval(expression, globals=None, locals=None)
参数:
expression
:必选参数,可以是字符串,也可以是一个任意的code对象实例(可以通过compile函数创建)。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。globals
:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。locals
:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。- 如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。
2 eval函数应用
2.1 参数expression的使用
x = 10
y = 20
sum = eval('x + y')
print(sum)
# 30
eval函数的globals和locals参数都被忽略了,因此变量x和变量y都取得的是eval函数被调用环境下的作用域中的变量值,即:x = 10, y = 20,sum = x + y = 30
2.2 参数globals的使用
x = 10
y = 20
sum = eval('x + y', {'x': 1, 'y': 2})
print(sum)
# 3
eval函数只提供了globals参数而忽略了locals参数,因此locals会取globals参数的值,即:x = 1, y = 2,sum = x + y = 3
2.3 参数locals的使用
x = 10
y = 20
sum = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
print(sum)
# 4
eval函数的globals参数和locals都被提供了,那么eval函数会先从全部作用域globals中找到变量x, 从局部作用域locals中找到变量y,即:x = 1, y = 3, sum = x + y = 4
2.4 返回值None
x = 10
y = 20
res = eval('print(x, y)')
print(res)
# 10 20
# None
因为print()函数不是一个计算表达式,没有计算结果,因此返回值为None
3 eval不适用的情况
eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。
eval("__import__('os').system('ls /etc/docker')"
那么eval()执行后,当前文件夹文件都会展如今用户前面。这句其实相当于执行了以下代码
os.system('ls /etc/docker')
如果继续输入
eval("__import__('os').system('cat /xxxx/xxxx/cert.pem')")
那么秘密文件都给别人看到了,那么继续执行以下代码
eval("__import__('os').system('rm /xxxx/xxxx/cert.pem')")
重要文件都被删除了
所以,使用eval函数,还要注意安全性
✏ 总结
在Python程序中使用evel
函数,不仅提供了很方便的操作,同时存在一定的安全风险,在使用过程中,需要避免风险发生。