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连接sql server乱码的解决方法
Jan 28 Python
python实现TCP服务器端与客户端的方法详解
Apr 30 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
在Django中使用Sitemap的方法讲解
Jul 22 Python
利用python将json数据转换为csv格式的方法
Mar 22 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
详解Python 4.0 预计推出的新功能
Jul 26 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
在django中form的label和verbose name的区别说明
May 20 Python
python 邮件检测工具mmpi的使用
Jan 04 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
香妃
2021/03/03 冲泡冲煮
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
PHP7 新增常量
2021/03/09 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
深入分析python中整型不会溢出问题
2018/06/18 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
资料员岗位职责
2013/11/17 职场文书
应届生自荐信范文
2014/02/21 职场文书
读书演讲主持词
2014/03/18 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
党员个人整改措施
2014/10/24 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
员工考勤管理制度
2015/08/06 职场文书
大学生党课感想
2015/08/11 职场文书