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中的lambda表达式的用法
Aug 28 Python
用python写的一个wordpress的采集程序
Feb 27 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
Python操作Excel之xlsx文件
Mar 24 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
使用Python对微信好友进行数据分析
Jun 27 Python
解决pyqt5中QToolButton无法使用的问题
Jun 21 Python
python实现大文本文件分割
Jul 22 Python
python数据预处理方式 :数据降维
Feb 24 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
Python如何给函数库增加日志功能
Aug 04 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 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python作用域用法实例详解
2016/03/15 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
几个Shell Script面试题
2014/04/18 面试题
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
Unix里面如何在后台运行程序
2016/10/14 面试题
学生励志演讲稿
2014/01/06 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
营销总监岗位职责
2014/09/16 职场文书
秋收起义观后感
2015/06/11 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
分享几种python 变量合并方法
2022/03/20 Python