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爬虫的基本写法
Jan 08 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
Feb 14 Python
python 使用get_argument获取url query参数
Apr 28 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
python查看数据类型的方法
Oct 12 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
弄清Pytorch显存的分配机制
Dec 10 Python
Python超简单容易上手的画图工具库推荐
May 10 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
Array of country list in PHP with Zend Framework
2011/10/17 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
jquery 经典动画菜单效果代码
2010/01/26 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
Vue 仿百度搜索功能实现代码
2017/02/16 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
python下载文件时显示下载进度的方法
2015/04/02 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python psutil模块使用方法解析
2019/08/01 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
SQL Server面试题
2016/10/17 面试题
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
初中信息技术教学反思
2016/02/16 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
Golang gRPC HTTP协议转换示例
2022/06/16 Golang