python字符串类型转换eval()和ast.literal_
2020-11-20 本文已影响0人
奈斯凸米特
在Python中,如果要将字符串类型的列表、元祖、字典等转换成对应的类型,可以使用两个方法,eval()和ast.literal_eval(),例如:
# 形如列表的a字符串
a = '[1,2,3]'
b = eval(a)
c = ast.literal_eval(a)
#输出结果都是列表形式
[1, 2, 3]
那么这两者之间有没有什么区别?
eval()还有一个功能就是可以进行运算,比如:
eval('1 + 1')
# 输出int型的2
2
不仅如此,还可以进行系统命令的执行,如:

所以这样就存在安全隐患,万一用户执行了一个危险的系统命令,比如:删除某些重要文件 _ import _('os').system('rm -rf /etc/*'),或者格式化磁盘等命令;这样带来的后果是不堪设想的。所以ast.literal_eval()出现了
我们先来执行一下正常运算:
ast.literal_eval('1+1')
# 输出也是int型的2
2
再执行一个系统指令:
