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 zip文件 压缩
Dec 24 Python
python去掉字符串中重复字符的方法
Feb 27 Python
python实现探测socket和web服务示例
Mar 28 Python
Python中的多重装饰器
Apr 11 Python
Python中函数的参数传递与可变长参数介绍
Jun 30 Python
python装饰器常见使用方法分析
Jun 26 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
python中从for循环延申到推导式的具体使用
Nov 29 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
python按照list中字典的某key去重的示例代码
Oct 13 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
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
小学生期末自我鉴定
2014/01/19 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
2015高考寄语集锦
2015/02/27 职场文书
留学推荐信英文范文
2015/03/26 职场文书
村党组织公开承诺书
2015/04/30 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python