python的exec、eval使用分析


Posted in Python onDecember 11, 2017

简介

python 动态执行字符串代码片段(也可以是文件), 一般会用到exec,eval。

exec

exec_stmt ::= "exec" or_expr ["in" expression ["," expression]]

注意:exec 是一个语法声明,不是一个函数.也就是说和if,for一样.

官方文档对于exec的解释

This statement supports dynamic execution of Python code.

exec的第一个表达式可以是:

1.代码字符串
2.文件对象
3.代码对象
4.tuple

前面三种情况差不多,第四种比较特殊最后讲

如果忽略后面的可选表达式,exec后面代码将在当前域执行

>>> a=2
>>> exec "a=1"
>>> a
>>>

如果在表达式之后使用in选项指定一个dic,它将作为global和local变量作用域

>>> a=10
>>> b=20
>>> g={'a':6,'b':8}
>>> exec "global a;print a,b" in g
>>>

如果in后详指定两个表达式,它们将分别用作global和local变量作用域

>>> a=10
>>> b=20
>>> c=20
>>> g={'a':6,'b':8}
>>> l={'b':9,'c':10}
>>> exec "global a;print a,b,c" in g,l
>>>

现在说下tuple的情况,这也是导致很多人误以为exec是一个函数的原因。

如果第一个表达式是tuple

exec(expr, globals) #它等效与 exec expr in globals
exec(expr, globals, locals) #它等效与 exec expr in globals,locals

eval

eval通常用来执行一个字符串表达式,并返回表达式的值。

eval(expression[, globals[, locals]])

有三个参数,表达式字符串,globals变量作用域,locals变量作用域。 其中第二个和第三个参数是可选的。

如果忽略后面两个参数,则eval在当前作用域执行。

>>> a=1
>>> eval("a+1")
>>>

如果指定globals参数

>>> a=1
>>> g={'a':10}
>>> eval("a+1",g)
>>>

如果指定locals参数

>>> a=10
>>> b=20
>>> c=20
>>> g={'a':6,'b':8}
>>> l={'b':9,'c':10}
>>> eval("a+b+c",g,l)
>>>

如果要严格限制eval执行,可以设置globals为__builtins__,这样 这个表达式只可以访问__builtin__ module。

总结

exec,eval给我带来了极大的灵活性,同时也带来了隐含的危险性, 当我们使用它们的时候应该总是记得详细指定其执行的作用域。

以上就是本文关于python的exec、eval使用分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python中的Classes和Metaclasses详解
Apr 02 Python
讲解Python中运算符使用时的优先级
May 14 Python
Python简单计算文件夹大小的方法
Jul 14 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 Python
Python函数中的可变长参数详解
Sep 12 Python
python之生成多层json结构的实现
Feb 27 Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 Python
Python中eval带来的潜在风险代码分析
Dec 11 #Python
Python验证文件是否可读写代码分享
Dec 11 #Python
Python文件操作基本流程代码实例
Dec 11 #Python
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 #Python
浅析Git版本控制器使用
Dec 10 #Python
python中Apriori算法实现讲解
Dec 10 #Python
Python自动化运维之IP地址处理模块详解
Dec 10 #Python
You might like
用PHP产生动态的影像图
2006/10/09 PHP
我的论坛源代码(八)
2006/10/09 PHP
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
php读取目录所有文件信息dir示例
2014/03/18 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
实例讲解php实现多线程
2019/01/27 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
python获取Pandas列名的几种方法
2019/08/07 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
机械专业毕业生推荐信范文
2013/11/25 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
函授药学自我鉴定
2014/02/07 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
胡桃夹子观后感
2015/06/11 职场文书
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android