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中函数参数设置及使用的学习笔记
May 03 Python
python解决Fedora解压zip时中文乱码的方法
Sep 18 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
使用 Python 遍历目录树的方法
Feb 29 Python
Python flask路由间传递变量实例详解
Jun 03 Python
python 如何将office文件转换为PDF
Sep 22 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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 中的str_replace 函数总结
2007/04/27 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
python 高阶函数简单介绍
2021/02/19 Python
工程造价与管理专业应届生求职信
2013/11/23 职场文书
出国考察邀请函
2014/01/21 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
在职证明书模板
2015/06/15 职场文书
红色经典电影观后感
2015/06/18 职场文书
八年级英语教学反思
2016/02/15 职场文书
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电