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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
python网络编程之数据传输UDP实例分析
May 20 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
Dec 24 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
利用Python批量识别电子账单数据的方法
Feb 08 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
第十一节 重载 [11]
2006/10/09 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
python从入门到精通(DAY 2)
2015/12/20 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
python常用函数详解
2016/09/13 Python
python实现KNN分类算法
2019/10/16 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
纬创Java面试题笔试题
2014/10/02 面试题
设计模式的基本要素是什么
2014/04/21 面试题
大学生求职信范文应怎么写
2014/01/01 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
工作犯错保证书
2015/05/11 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
Redis分布式锁Redlock的实现
2021/08/07 Redis