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实现获取网站PR及百度权重
Jan 21 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
Python continue继续循环用法总结
Jun 10 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
python django生成迁移文件的实例
Aug 31 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
Python实现转换图片背景颜色代码
Apr 30 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
聊天室php&mysql(一)
2006/10/09 PHP
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
PHP中使用BigMap实例
2015/03/30 PHP
ThinkPHP控制器详解
2015/07/27 PHP
javascript document.execCommand() 常用解析
2009/12/14 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
python正则表达式中的括号匹配问题
2014/12/14 Python
详解python之简单主机批量管理工具
2017/01/27 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
学生出入校管理制度
2014/01/16 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
党员自我对照检查材料
2014/08/19 职场文书
2014年城市管理工作总结
2014/12/02 职场文书