python函数eval与ast.literal_eval的区别
eval
与ast.literal_eval
都可以将字符串还原成它能够转化成的数据类型,例如
>>> from ast import literal_eval
>>>
>>> data1 = "['ops-coffee','cn']"
>>> data2 = "{'title':'python','url':'https://www.python.org'}"
>>>
>>> print(type(data1),type(data2))
<class 'str'> <class 'str'>
>>>
>>>
>>>
>>> a1 = eval(data1)
>>> print(a1, type(a1))
['ops-coffee', 'cn'] <class 'list'>
>>>
>>> a2 = eval(data2)
>>> print(a2, type(a2))
{'title': 'python', 'url': 'https://www.python.org'} <class 'dict'>
>>>
>>>
>>>
>>> b1 = literal_eval(data1)
>>> print(b1, type(b1))
['ops-coffee', 'cn'] <class 'list'>
>>>
>>> b2 = literal_eval(data2)
>>> print(b2, type(b2))
{'title': 'python', 'url': 'https://www.python.org'} <class 'dict'>
>>>
>>>
除了可以对数据类型进行转换外,他们还可以对字符串的输入做处理,例如
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> eval('1+1')
2
>>>
>>>
>>> literal_eval('1+1')
2
那么他们有何区别呢?
eval会对所有他能解析的字符串都做处理,而literal_eval
则会判断需要处理的内容处理后是不是合法的python类型,如果是则处理,否则不处理
例如在以下例子中
>>> std = input('please input: ')
please input: __import__('os').system('ls /')
>>> print('out: ',eval(std))
bin boot dev etc lib lost+found opt proc root run sbin selinux srv static sys tmp usr var
out: 0
>>>
eval处理了输入的指令,这是非常危险的,在这里仅仅是用了ls查看做测试,如果是rm之类的指令后果就会很严重,而对于literal_eval
则会去判断要解析的内容是否安全,不安全就报错
>>> print('out: ',literal_eval(std))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/ast.py", line 85, in literal_eval
return _convert(node_or_string)
File "/usr/local/lib/python3.6/ast.py", line 84, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Call object at 0x7f3b192a24a8>
>>>
所以使用literal_eval
可大大降低系统风险,有着更为安全的表现
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16761468.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!