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 相关文章推荐
Android应用开发中Action bar编写的入门教程
Feb 26 Python
python字符类型的一些方法小结
May 16 Python
python 从csv读数据到mysql的实例
Jun 21 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
python矩阵/字典实现最短路径算法
Jan 17 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
python输出pdf文档的实例
Feb 13 Python
django的autoreload机制实现
Jun 03 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
JS控制表格隔行变色
2006/06/26 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
python刷投票的脚本实现代码
2014/11/08 Python
在Python中使用元类的教程
2015/04/28 Python
浅谈Python NLP入门教程
2017/12/25 Python
python的sorted用法详解
2019/06/25 Python
简单了解django orm中介模型
2019/07/30 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
工程管理专业毕业生自荐信
2014/01/24 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
临床专业自荐信
2014/06/22 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android