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采集博客中上传的QQ截图文件
Jul 18 Python
python中查看变量内存地址的方法
May 05 Python
Python复制文件操作实例详解
Nov 10 Python
浅谈Python 对象内存占用
Jul 15 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
在dataframe两列日期相减并且得到具体的月数实例
Jul 03 Python
flask实现验证码并验证功能
Dec 05 Python
通过实例解析python and和or使用方法
Nov 14 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 Python
如何用Python提取10000份log中的产品信息
Jan 14 Python
Python集合的基础操作
Nov 01 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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/10/15 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
javascript 学习之旅 (2)
2009/02/05 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
python对字典进行排序实例
2014/09/25 Python
python类继承用法实例分析
2015/05/27 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
露营世界:Camping World
2017/02/02 全球购物
企业文化标语大全
2014/06/10 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
纪录片信仰观后感
2015/06/08 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript