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去除文件中空格、Tab及回车的方法
Apr 12 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
windows下python安装小白入门教程
Sep 18 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
python3.6使用SMTP协议发送邮件
May 20 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
Django model重写save方法及update踩坑详解
Jul 27 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
php4的彩蛋
2006/10/09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
python删除不需要的python文件方法
2018/04/24 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
拉贝日记观后感
2015/06/05 职场文书
《风筝》教学反思
2016/02/23 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android