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封装对象实现时间效果
Apr 23 Python
Python命名空间详解
Aug 18 Python
python中的lambda表达式用法详解
Jun 22 Python
Python制作简易注册登录系统
Dec 15 Python
浅析Git版本控制器使用
Dec 10 Python
python spyder中读取txt为图片的方法
Apr 27 Python
如何在 Django 模板中输出 "{{"
Jan 24 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
看看如何用Python绘制小米新版天价logo
Apr 20 Python
Python初识逻辑与if语句及用法大全
Aug 07 Python
python计算列表元素与乘积详情
Aug 05 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缓冲区用法总结
2016/02/14 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
npm qs模块使用详解
2020/02/07 Javascript
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
python实现类之间的方法互相调用
2018/04/29 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
护理人员的自我评价分享
2014/03/15 职场文书
邀请函怎么写
2015/01/30 职场文书
父亲节活动总结
2015/02/12 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis
Spring Boot 实现 WebSocket
2022/04/30 Java/Android
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js