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文件和目录操作详解
Feb 08 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
详解python中的time和datetime的常用方法
Jul 08 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 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 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
php加密解密实用类分享
2014/01/07 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
python通过wxPython打开一个音频文件并播放的方法
2015/03/25 Python
python比较两个列表大小的方法
2015/07/11 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
python实现逻辑回归的示例
2020/10/09 Python
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
团工委书记自荐书范文
2013/12/17 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
刊首寄语大全
2014/04/11 职场文书
租赁协议书范本
2014/04/22 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
毕业生个人总结
2015/02/28 职场文书
师范生教育见习总结
2015/06/23 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android