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访问系统环境变量的方法
Apr 29 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
Python的for和break循环结构中使用else语句的技巧
May 24 Python
详解Swift中属性的声明与作用
Jun 30 Python
浅谈Python中的zip()与*zip()函数详解
Feb 24 Python
pandas string转dataframe的方法
Apr 11 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
Django+boostrap 美化admin后台的操作
Mar 11 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 Python
python基础之匿名函数详解
Apr 21 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制作静态网站的模板框架(二)
2006/10/09 PHP
需要发散思维学习PHP
2009/06/29 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
各种快递查询--Api接口
2016/04/26 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
JS实现多选框的操作
2020/06/24 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python数组并集交集补集代码实例
2020/02/18 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
教师党员批评与自我批评发言稿
2014/10/15 职场文书
公司催款律师函
2015/05/27 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
Redis Lua脚本实现ip限流示例
2022/07/15 Redis