Python使用eval函数执行动态标表达式过程详解


Posted in Python onOctober 17, 2020

英文文档:

eval(expression, globals=None, locals=None)
The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, localscan be any mapping object.

The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__', the current globals are copied into globals before expression is parsed. This means that expressionnormally has full access to the standard builtins module and restricted environments are propagated. If the localsdictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:

>>> x = 1
>>> eval('x+1')
2

This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with 'exec' as the mode argument, eval()‘s return value will be None.

Hints: dynamic execution of statements is supported by the exec() function. The globals() and locals() functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by eval() or exec().
See ast.literal_eval() for a function that can safely evaluate strings with expressions containing only literals.

执行动态标表达式求值

说明:

1. 执行动态语句,返回语句执行的值。

>>> eval('1+2+3+4')
10

2. 第一个参数为语句字符串,globals参数和locals参数为可选参数,如果提供,globals参数必需是字典,locals参数为mapping对象。

3. globals参数用来指定代码执行时可以使用的全局变量以及收集代码执行后的全局变量。

>>> g = {'num':2}

>>> eval('num + 2') #num未定义
Traceback (most recent call last):
 File "<pyshell#3>", line 1, in <module>
  eval('num + 2')
 File "<string>", line 1, in <module>
NameError: name 'num' is not defined

>>> eval('num + 2',g) #g中有定义num,可执行
4

4. locals参数用来指定代码执行时可以使用的局部变量以及收集代码执行后的局部变量

>>> g = {'num1':2}
>>> l = {'num2':4}
>>> eval('num1+num2',g,l)
6

5. 为了保证代码成功运行,globals参数字典不包含 __builtins__ 这个 key 时,Python会自动添加一个key为 __builtins__ ,value为builtins模块的引用。如果确实要限制代码不使用builtins模块,需要在global添加一个key为__builtins__,value为{}的项即可(很少有人这么干吧)。

>>> g = {}
>>> eval('abs(-1)',g)
1
>>> g = {'__builtins__':{}}
>>> eval('abs(-1)',g) #不能使用内置函数了
Traceback (most recent call last):
 File "<pyshell#9>", line 1, in <module>
  eval('abs(-1)',g)
 File "<string>", line 1, in <module>
NameError: name 'abs' is not defined

6. 当globals参数不提供是,Python默认使用globals()函数返回的字典去调用。当locals参数不提供时,默认使用globals参数去调用。

>>> num = 1
>>> eval('num+2')
3

>>> globals() #返回字典中含有num的key
{'__doc__': None, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}

>>> eval('num+2',{}) #locals参数未提供,locals参数=globals参数
Traceback (most recent call last):
 File "<pyshell#3>", line 1, in <module>
  eval('num+2',{})
 File "<string>", line 1, in <module>
NameError: name 'num' is not defined

>>> l = locals() 
>>> eval('num+2',{},l) #locals参数含有num的key,能求值
3

>>> locals()
{'__doc__': None, 'l': {...}, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}
>>>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现简单的TCP代理服务器
Oct 08 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
python创建临时文件夹的方法
Jul 06 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
对python中的for循环和range内置函数详解
Apr 17 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
Python机器学习之基于Pytorch实现猫狗分类
Jun 08 Python
Python基于locals返回作用域字典
Oct 17 #Python
Python classmethod装饰器原理及用法解析
Oct 17 #Python
Python基于staticmethod装饰器标示静态方法
Oct 17 #Python
详解python算法常用技巧与内置库
Oct 17 #Python
Python 操作SQLite数据库的示例
Oct 16 #Python
python Selenium 库的使用技巧
Oct 16 #Python
用Python进行websocket接口测试
Oct 16 #Python
You might like
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
PHP页面中文乱码分析
2013/10/29 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
php简单smarty入门程序实例
2015/06/11 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
常用jQuery代码分享
2015/07/14 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
Python中规范定义命名空间的一些建议
2016/06/04 Python
python放大图片和画方格实现算法
2018/03/30 Python
python3.4爬虫demo
2019/01/22 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
python中类与对象之间的关系详解
2020/12/16 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
英国电信商店:BT Shop
2019/12/17 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
工厂保安员岗位职责
2014/01/31 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书