电子说
python中,eval可以将字符串型的list,tuple,dict转变成原有的类型。
即,eval可以把数据还原成它本身或者是能够转化成的数据类型。
//string 转 list
>>> str_list='[1,2,3,4]'
>>> eva_list=eval(str_list)
>>> str_list;eva_list
'[1,2,3,4]'
[1, 2, 3, 4]
>>> type(str_list);type(eva_list)
<type 'str'>
<type 'list'>
//string 转 tuple
>>> str_tuple='(1,2,3)'
>>> eval_tuple=eval(str_tuple)
>>> str_tuple;eval_tuple
'(1,2,3)'
(1, 2, 3)
>>> type(str_tuple);type(eval_tuple)
<type 'str'>
<type 'tuple'>
//string 转 dict
>>> str_dict="{'name':'nihao'}"
>>> eval_dict=eval(str_dict)
>>> str_dict;eval_dict
"{'name':'nihao'}"
{'name': 'nihao'}
>>> type(str_dict);type(eval_dict)
<type 'str'>
<type 'dict'>
>>> ret=eval(raw_input('请输入字符串:'))
请输入字符串:1+1
>>> ret
2
只要eval能解析的字符串,都会当做合法的表达式或命令执行,而不顾可能带来的后果。
>>> open(r'E://filename.txt','r').read
>>> __import__('os').system('dir')
>>> __import__('os').system('rm -rf /etc/*')
eval强大的背后,是巨大的安全隐患。比如上面的删除文件。
所以,才有了ast.literal_eval。
ast.literal_eval(),先判断执行的内容是不是合适的python类型,如果是则执行,否则就不执行。
这样可以大大降低系统的危险性,所以,对字符串进行类型转换的时候,最好是用ast.literal_eval()函数。
# 合适数据类型
>>> ast.literal_eval('[1,2,3]')
[1, 2, 3]
>>> ast.literal_eval('(1,2,3)')
(1, 2, 3)
>>> ast.literal_eval("{'name':'nihao'}")
{'name': 'nihao'}
# 不合适数据类型
>>> ast.literal_eval('1+1')
Traceback (most recent call last):
File "
全部0条评论
快来发表一下你的评论吧 !