Python中函数 eval 和 ast.literal_eval 的区别详解

本文详细解析了Python中的eval和ast.literal_eval函数。eval功能强大,能进行类型转换和计算,但存在严重的安全风险,如允许执行恶意代码。ast.literal_eval作为更安全的选择,仅能执行合法的Python类型,避免了不必要的风险。建议在处理字符串类型转换时优先使用ast.literal_eval。

一、eval 函数

Python中,如果要将字符串型的 list,tuple,dict 转变成原有的类型呢 ?

这个时候你自然会想到eval
eval函数在 Python 中做数据类型的转换还是很有用的。
它的作用就是把数据还原成它本身或者是能够转化成的数据类型

  1. string 转化为 list
    在这里插入图片描述
  2. string 转化为 tuple
    在这里插入图片描述
  3. stirng 转化为 dict
    在这里插入图片描述

即使用 eval 可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符串型的输入直接计算
比如,她会将’1+1’的计算串直接计算出结果
在这里插入图片描述
从上面来看,eval功能可谓非常强大,即可以做 string 与 list,tuple,dict 之间的类型转换,还可以做计算器使用!
更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!
所以说eval强大的背后,是巨大的安全隐患!!! 比如说,用户恶意输入下面的字符串

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

此时eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件…如果是格盘等更严重的操作,她也会照做不误!!!

所以这里就引出了另外一个安全处理方式ast.literal_eval

二、ast.literal_eval 函数

简单点说 ast 模块就是帮助Python应用来处理抽象的语法解析的

而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算

比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval() ,都会拒绝执行。报值错误,不合法的字符串!
在这里插入图片描述
而只会执行合法的Python类型,从而大大降低系统的危险性!
在这里插入图片描述
所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()函数!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值