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


Posted in Python onAugust 10, 2017

前言

众所周知在Python中,如果要将字符串型的list,tuple,dict转变成原有的类型呢? 这个时候你自然会想到eval. eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.下面来看看示例代码:

string <==> list

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

string <==> tuple

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

string <==> dict

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

也就是说,使用eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符
串型的输入直接计算。比如,她会将'1+1'的计算串直接计算出结果。

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

从上面来看,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.可以先看下stackoverflow及Python官方关于这个解释!

stackoverflow

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

Python官方文档

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

简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。

比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval() ,都会拒绝执行。

报值错误,不合法的字符串!

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

而只会执行合法的Python类型,从而大大降低系统的危险性!

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

所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()函数!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python 中的列表解析和生成表达式
Mar 10 Python
Python通过select实现异步IO的方法
Jun 04 Python
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
Django实现自定义404,500页面教程
Mar 26 Python
老生常谈Python基础之字符编码
Jun 14 Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
python 梯度法求解函数极值的实例
Jul 10 Python
python3实现单目标粒子群算法
Nov 14 Python
python统计字符的个数代码实例
Feb 07 Python
使用Django搭建网站实现商品分页功能
May 22 Python
python中的getter与setter你了解吗
Mar 24 Python
Python基础之getpass模块详细介绍
Aug 10 #Python
Python中字典(dict)合并的四种方法总结
Aug 10 #Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 #Python
Python 操作文件的基本方法总结
Aug 10 #Python
Python 模拟登陆的两种实现方法
Aug 10 #Python
Python 网页解析HTMLParse的实例详解
Aug 10 #Python
关于Python中浮点数精度处理的技巧总结
Aug 10 #Python
You might like
php的curl实现get和post的代码
2008/08/23 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
Django卸载之后重新安装的方法
2017/03/15 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
对python:print打印时加u的含义详解
2018/12/15 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
应聘自荐书
2013/10/08 职场文书
中学生自我评价范文
2014/02/08 职场文书
银行职员自我鉴定
2014/04/20 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs