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中的死锁、可重入锁和互斥锁
Nov 05 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
TensorFlow如何实现反向传播
Feb 06 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
python获取地震信息 微信实时推送
Jun 18 Python
如何运行.ipynb文件的图文讲解
Jun 27 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
python 制作网站筛选工具(附源码)
Jan 21 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
php跨站攻击实例分析
2014/10/28 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
addEventListener 的用法示例介绍
2014/05/07 Javascript
JS交换变量的方法
2015/01/21 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
新闻上下滚动jquery 超简洁(必看篇)
2017/01/21 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
vue实现循环切换动画
2018/10/17 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
python创建关联数组(字典)的方法
2015/05/04 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
Linux的文件类型
2012/03/07 面试题
金融专业毕业生推荐信
2013/11/26 职场文书
减负增效提质方案
2014/05/23 职场文书
水电维修专业推荐信
2014/09/06 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python