eval和ast.literal_eavl区别

电子说

1.2w人已加入

描述

1 eval

1.1 字符串型数据还原本身类型

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'>

1.2 字符串型数据进行运算

>>> ret=eval(raw_input('请输入字符串:'))
 请输入字符串:1+1
 >>> ret
 2

1.3 字符串型语句命令

只要eval能解析的字符串,都会当做合法的表达式或命令执行,而不顾可能带来的后果。

>>> open(r'E://filename.txt','r').read
 >>> __import__('os').system('dir')
 >>> __import__('os').system('rm -rf /etc/*')

eval强大的背后,是巨大的安全隐患。比如上面的删除文件。

所以,才有了ast.literal_eval。

2 literal_eval

ast.literal_eval(),先判断执行的内容是不是合适的python类型,如果是则执行,否则就不执行。

这样可以大大降低系统的危险性,所以,对字符串进行类型转换的时候,最好是用ast.literal_eval()函数。

2.1 合适数据类型

# 合适数据类型
 >>> 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'}

2.2 不合适数据类型

# 不合适数据类型
 >>> ast.literal_eval('1+1')
 
 Traceback (most recent call last):
   File "
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分