python3 中的 eval 函数

 

From:http://blog.csdn.net/zhanh1218/article/details/37562167

Python:eval的妙用和滥用:https://blog.csdn.net/zhanh1218/article/details/37562167
python eval():http://www.cnblogs.com/dadadechengzi/p/6149930.html
Python eval 函数妙用:http://www.cnblogs.com/liu-shuai/p/6098246.html
Python 中 eval 带来的潜在风险:https://blog.csdn.net/u011721501/article/details/47298723
Python之 eval() 函数危险性浅析:https://www.jb51.net/article/51814.htm

 

 

eval() 函数十分强大,官方文档解释是:将字符串 string 对象 转化为有效的表达式参与求值运算返回计算结果
语法上:调用的是:eval(expression,globals=None, locals=None)返回的是计算结果
so,结合 math 当成一个计算器很好用。
可以把 list、tuple、dict 和 string 相互转化

其中:
        expression 是一个参与计算的 python 表达式
        globals 是可选的参数,如果设置属性不为 None 的话,就必须是 dictionary 对象了
        locals 也是一个可选的对象,如果设置属性不为 None 的话,可以是任何 map 对象了

python 是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。

当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

  • 1)局部名字空间 - 特指当前函数或类的方法。
          如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。
  • 2)全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
  • 3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

python 的全局名字空间存储在一个叫 globals() 的 dict 对象 中;局部名字空间存储在一个叫 locals() 的 dict 对象中。
我们可以用 print (locals()) 来查看该函数体内的所有变量名和变量值。

下面简单演示一下 eval()函数的使用:

#!usr/bin/env python
#encoding:utf-8import mathdef eval_test():l='[1,2,3,4,[5,6,7,8,9]]'d="{'a':123,'b':456,'c':789}"t='([1,3,5],[5,6,7,8,9],[123,456,789])'print '--------------------------转化开始--------------------------------'print type(l), type(eval(l))print type(d), type(eval(d))print type(t), type(eval(t))if __name__=="__main__":eval_test()

运行结果为:

--------------------------转化开始--------------------------------
<type 'str'> <type 'list'>
<type 'str'> <type 'dict'>
<type 'str'> <type 'tuple'>
[Finished in 0.2s]

a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
b
Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]type(b)
Out[4]: lista = "{1: 'a', 2: 'b'}"
b = eval(a)
b
Out[7]: {1: 'a', 2: 'b'}type(b)
Out[8]: dicta = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a)b
Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

eval 函数就是实现list、dict、tuple与 str 之间的转化
str 函数把 list,dict,tuple 转为为 字符串
# 字符串转换成列表
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(type(a))
b = eval(a)
print(b)

# 字符串转换成字典
a = "{1: 'a', 2: 'b'}"
print(type(a))
b = eval(a)
print(type(b))
print(b)

# 字符串转换成元组
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
print(type(a))
b=eval(a)
print(type(b))
print(b)

上面简单演示的是eval在字符串对象和list、dictinoary、tuple对象之间的转换作用。

不可谓不强大!

BUT!强大的函数有代价。安全性是其最大的缺点。

想一想这种使用环境:需要用户输入一个表达式,并求值。

如果用户恶意输入,例如:__import__('os').system('dir')
那么 eval() 之后,你会发现,当前目录文件都会展现在用户前面。

eval(__import__('os').system('dir'))

 

那么继续输入:open('文件名').read()
代码都给人看了。获取完毕,一条删除命令,文件消失。哭吧!

 

众所周知:

eval()的确是一个很便捷的工具,但是便捷使用不当的同时也会造成严重的安全问题,不少的文章和博客都对eval()的安全性进行了相关的分析,在这里我就不多说了。

怎么避免安全问题?
1、自行写检查函数;
2、使用 ast.literal_eval:自行查看DOCUMENT:https://docs.python.org/2/library/ast.html
3、更多好文:Restricted "safe" eval(Python recipe):http://code.activestate.com/recipes/496746-restricted-safe-/

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 自带工具类~StringUtils

org.springframework.util.StringUtils 1、字符串判断工具 // 判断字符串是否为 null&#xff0c;或 ""。注意&#xff0c;包含空白符的字符串为非空 boolean isEmpty(Object str) // 判断字符串是否是以指定内容结束。忽略大小写 boolean endsWithIgnoreCase…

C语言中float,double类型,在内存中的结构(存储方式).

从存储结构和算法上来讲&#xff0c;double和float是一样的&#xff0c;不一样的地方仅仅是float是32位的&#xff0c;double是64位的&#xff0c;所以double能存储更高的精度。 任何数据在内存中都是以二进制&#xff08;0或1&#xff09;顺序存储的&#xff0c;每一个1或0被称…

html超链接去虾线,挑虾线别只会用牙签了,渔民都是这样做的,1秒处理一个,超方便...

现在大家的生活条件已经越来越好&#xff0c;所以说人们在城市的时候也是越来越注意饮食这一方面了&#xff0c;但其实大家在做饭的时候都喜欢买上一些营养丰富的食材&#xff0c;就像是在最近几年海鲜也是让大家都非常喜欢的。海鲜是我们日常生活中都非常喜欢的一个美食&#…

AI将成科学家“高级定制”工具

来源&#xff1a;科技日报 作者&#xff1a;房琳琳化学家有了新的实验助手——人工智能&#xff08;AI&#xff09;。随着深度学习算法的进一步应用&#xff0c;AI计算机程序能帮助药物化合物等小有机分子产生所需的反应序列&#xff0c;制定合成路径。《自然》杂志近日发表了…

Xvfb 虚拟现实库 之 Python 虚拟桌面 pyvirtualdisplay

如何在Xvfb中运行Selenium&#xff1f;&#xff1a;https://cloud.tencent.com/developer/ask/107705 命令&#xff1a;nohup Xvfb -ac :7 -screen 0 1366x1024x8 -maxclients 512 >/dev/null & Is there a Windows equivalent to PyVirtualDisplay&#xff1a;https:…

SpringBoot 自带工具类~CollectionUtils

org.springframework.util.CollectionUtils 1、集合判断工具 // 判断 List/Set 是否为空 boolean isEmpty(Collection<?> collection) // 判断 Map 是否为空 boolean isEmpty(Map<?,?> map) // 判断 List/Set 中是否包含某个对象 boolean containsIns…

因HTTP的Header长度过长导致下载文件名出现乱码的问题

在通过IE直接下载文件的时候&#xff0c;我们可能会遇到一个比较常见的问题&#xff0c;那就是&#xff1a;我们下载的文件的文件名如果过长的话&#xff0c;就会出现&#xff0c;弹出的提示框的文件标题名变成乱码&#xff0c;即“%f%e%1”这样的乱码&#xff0c;而且点击保存…

华为式创新与海尔式创新——两条道路考验中国制造

来源&#xff1a;企业管理杂志&#xff08;ID&#xff1a;qyglzz&#xff09;作者&#xff1a;吴兴杰&#xff0c;中国管理科学研究院专家咨询委员会副主任、学术委员会委员、研究员以华为为代表的聚合化创新之路非常难走而又不得不走&#xff0c;否则永远只能当二流甚至三流企…

Python 日期 的 加减 等 操作

datetime — Basic date and time types&#xff1a;https://docs.python.org/3.8/library/datetime.html dateutil --- powerful extensions to datetime&#xff1a;https://dateutil.readthedocs.io/en/stable/index.html Python time 和 datetime 的常用转换处理&#xf…

计算机网络技术专业的规划,计算机网络技术专业建设规划

附件2:计算机网络技术专业建设规划专业建设与发展是高职教育人才培养的重要依据&#xff0c;决定着人才培养质量和培养规格&#xff0c;体现了学校的办学实力与办学水平。2012年以前&#xff0c;电子信息工程系有三个专业&#xff0c;分别是计算机应用技术专业、电子商务专业&a…

SpringBoot 自带工具类~FileCopyUtils

org.springframework.util.FileCopyUtils 1、输入 // 从文件中读入到字节数组中 byte[] copyToByteArray(File in) // 从输入流中读入到字节数组中 byte[] copyToByteArray(InputStream in) // 从输入流中读入到字符串中 String copyToString(Reader in) 2、输出 /…

ReaderMe 1.0.0.32版发布

2010-03-09 ReaderMe 1.0.0.321、添加“Ctrl M”快捷键&#xff0c;在当前光标位置做书签。2、更新软件内的主页链接&#xff0c;由原来的谷歌站点&#xff0c;改为博客园。 点击下载最新版本 转载于:https://www.cnblogs.com/gaoyunpeng/archive/2010/03/09/1681571.html

乐山市计算机学校太坑,乐山市计算机学校小规矩成就大素养

没有规矩&#xff0c;不成方圆。规矩&#xff0c;虽然约束了我们的一些行为&#xff0c;但究其根本是保障了大家的基本利益&#xff0c;使我们的学习、生活、工作有序推进。在乐山市计算机学校&#xff0c;我们有校规校纪&#xff0c;“十条红线”、“三不两禁”的学生管理办法…

牛津大学计算机系主任:人工智能立法重在抓机遇、防危害

来源&#xff1a;科技日报 作者&#xff1a;郑焕斌“人工智能立法的重点应在于充分利用AI技术所提供的各种机遇&#xff0c;构建适宜的环境以激励、培育大量AI初创公司和新服务的发展&#xff0c;防范和应对AI技术所带来的各种潜在危害。”牛津大学计算机系主任迈克尔伍尔德里…

Python 数据可视化:WordCloud 词云的构建

WordCloud 官方文档&#xff1a;https://amueller.github.io/word_cloud/index.html WordCloud GitHub 地址&#xff1a;https://github.com/amueller/word_cloud Python非常重要的一个可视化库&#xff0c;wordcloud词云库了解一下&#xff01;&#xff1a;https://www.bilibi…

关于deepearth的一点小问题

我下载的deepEarth的源代码&#xff0c;编译以后有错误&#xff0c;不知怎么办&#xff0c;不知道各位用没用过deepEarth啊&#xff1f;请高手指教&#xff01; 转载于:https://www.cnblogs.com/kakaleilei/archive/2010/03/09/1681608.html

SpringBoot 自带工具类~ResourceUtils

org.springframework.util.ResourceUtils 1、从资源路径获取文件 // 判断字符串是否是一个合法的 URL 字符串。 static boolean isUrl(String resourceLocation) // 获取 URL static URL getURL(String resourceLocation) // 获取文件&#xff08;在 JAR 包内无法正常…

计算机术语局部性,【计算机基础】程序的局部性简介

什么是局部性&#xff1f;局部性分类局部性有什么作用&#xff1f;局部性举例数据引用的局部性取指令的局部性结论完整代码什么是局部性&#xff1f;程序倾向于使用它们最近使用的地址接近或相等的数据和指令。局部性分类局部性主要分为时间局部性和空间局部性。时间局部性&…

卫星还在“织网” 北斗时代尚需时日

来源&#xff1a;科技日报 作者&#xff1a;付丽丽生活在大都市里的人们&#xff0c;出门如果没有手机导航&#xff0c;会感觉自己像盲人一样不会走路。而让人更无法忍受的&#xff0c;则是傻导航的瞎导乱导&#xff0c;“我就老跟导航吵架&#xff0c;气得我把手机摔了的心都…

Python3.5 queue 模块详解 和 进程间通讯

queue — A synchronized queue class&#xff1a;https://docs.python.org/3/library/queue.html 菜鸟教程 - Python3 多线程&#xff1a;http://www.runoob.com/python3/python3-multithreading.html python3 队列&#xff1a;https://cloud.tencent.com/developer/informa…