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脚本来获取mp3文件tag信息的教程
May 04 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
Python中__repr__和__str__区别详解
Nov 07 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
Python timeit模块原理及使用方法
Oct 10 Python
Python 可视化神器Plotly详解
Dec 26 Python
FP-growth算法发现频繁项集——发现频繁项集
Jun 24 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
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
PHP JSON格式数据交互实例代码详解
2011/01/13 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
Vue数据双向绑定底层实现原理
2019/11/22 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
python实现批量修改文件名代码
2017/09/10 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
python将数组n等分的实例
2019/12/02 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
智能钱包:Ekster
2019/11/21 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
投标单位介绍信
2014/01/09 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
军训通讯稿范文
2015/07/18 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
个人道歉信大全
2019/04/11 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书