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实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Python实现字符串匹配的KMP算法
Apr 04 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
Python参数传递实现过程及原理详解
May 14 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
python Pexpect模块的使用
Dec 25 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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输入数据统一类实例
2015/02/23 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
php微信开发之百度天气预报
2016/11/18 PHP
使javascript也能包含文件
2006/10/26 Javascript
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
axios学习教程全攻略
2017/03/26 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
业务主管岗位职责范本
2013/12/25 职场文书
女子职高个人自荐书
2014/02/01 职场文书
大学生个人求职信例文
2014/07/07 职场文书
工程承包协议书范本
2014/09/29 职场文书
小学班主任个人总结
2015/03/03 职场文书
python中使用redis用法详解
2022/12/24 Redis