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类方法__init__和__del__构造、析构过程分析
Mar 06 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
python之pandas用法大全
Mar 13 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
Apr 09 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
python爬取微信公众号文章
Aug 31 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
python interpolate插值实例
Jul 06 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一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
python创建关联数组(字典)的方法
2015/05/04 Python
Python下载指定页面上图片的方法
2016/05/12 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
新春联欢会主持词
2014/03/24 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
工人先锋号申报材料
2014/12/29 职场文书
员工离职通知函
2015/04/25 职场文书
写给老师的保证书
2015/05/09 职场文书
高中运动会广播稿
2015/08/19 职场文书
《绝招》教学反思
2016/02/20 职场文书
创业计划书之美甲店
2019/09/20 职场文书
python读取mat文件生成h5文件的实现
2022/07/15 Python