python中float与eval式一样的吗_python函数eval与ast.literal_eval的区别

一分钟学个小知识

eval与ast.literal_eval都可以将字符串还原成它能够转化成的数据类型,例如

>>> from ast import literal_eval

>>>

>>> data1 = "['ops-coffee','cn']"

>>> data2 = "{'title':'运维咖啡吧','url':'https://ops-coffee.cn'}"

>>>

>>> print(type(data1),type(data2))

>>>

>>>

>>>

>>> a1 = eval(data1)

>>> print(a1, type(a1))

['ops-coffee', 'cn']

>>>

>>> a2 = eval(data2)

>>> print(a2, type(a2))

{'title': '运维咖啡吧', 'url': 'https://ops-coffee.cn'}

>>>

>>>

>>>

>>> b1 = literal_eval(data1)

>>> print(b1, type(b1))

['ops-coffee', 'cn']

>>>

>>> b2 = literal_eval(data2)

>>> print(b2, type(b2))

{'title': '运维咖啡吧', 'url': 'https://ops-coffee.cn'}

>>>

>>>

除了可以对数据类型进行转换外,他们还可以对字符串的输入做处理,例如

>>> 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 srvstaticsys tmp usr var

out: 0

>>>

eval处理了输入的指令,这是非常危险的,在这里仅仅是用了ls查看做测试,如果是rm之类的指令后果就会很严重,而对于literal_eval则会去判断要解析的内容是否安全,不安全就报错

>>>

>>> print('out: ',literal_eval(std))

Traceback (most recent call last):

File "", line 1, in

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>

>>>

所以使用literal_eval可大大降低系统风险,有着更为安全的表现

相关文章推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值