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 09 Python
Python实现控制台进度条功能
Jan 04 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python的socket编程入门
Jan 29 Python
Python 中Pickle库的使用详解
Feb 24 Python
python中正则表达式的使用方法
Feb 25 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
python神经网络编程实现手写数字识别
May 27 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 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
Terran历史背景
2020/03/14 星际争霸
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
Document对象内容集合(比较全)
2010/09/06 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
JS实现横向轮播图(中级版)
2020/01/18 Javascript
python多线程抓取天涯帖子内容示例
2014/04/03 Python
python实现统计代码行数的方法
2015/05/22 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
Python类的动态绑定实现原理
2020/03/21 Python
大学生社会实践评语
2014/04/25 职场文书
法制宣传标语
2014/06/23 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
优秀护士事迹材料
2014/12/25 职场文书
入伍通知书
2015/04/23 职场文书
写给女朋友的保证书
2015/05/09 职场文书
感恩主题班会教案
2015/08/12 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
会议主持词通用版
2019/04/02 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
python开发制作好看的时钟效果
2022/05/02 Python