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 random模块用法解析及简单示例
Dec 18 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
使用pycharm生成代码模板的实例
May 23 Python
TensorFlow Session会话控制&Variable变量详解
Jul 30 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
Python单元测试与测试用例简析
Nov 09 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 Python
什么是python类属性
Jun 10 Python
Python远程方法调用实现过程解析
Jul 28 Python
python简单实现9宫格图片实例
Sep 03 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
15种PHP Encoder的比较
2007/04/17 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
PHP实现简易blog的制作
2016/10/24 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
js实现随机点名功能
2020/12/23 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
python批量下载抖音视频
2019/06/17 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
python super用法及原理详解
2020/01/20 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
pymysql模块使用简介与示例
2020/11/17 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
古驰英国官网:GUCCI英国
2020/03/07 全球购物
亲子阅读的活动方案
2014/08/15 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android