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中expandtabs()方法的使用
May 18 Python
对python-3-print重定向输出的几种方法总结
May 11 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
python如何删除文件中重复的字段
Jul 16 Python
PyCharm 无法 import pandas 程序卡住的解决方式
Mar 09 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 Python
python实现定时发送邮件
Dec 23 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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
图象函数中的中文显示
2006/10/09 PHP
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
js 调用百度分享功能
2017/02/27 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
vue-router传参用法详解
2019/01/19 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
JS实现手风琴特效
2020/11/08 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python list转矩阵的实例讲解
2018/08/04 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
公司董事长职责
2013/12/12 职场文书
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
出纳担保书范文
2014/04/02 职场文书
班主任寄语大全
2014/04/04 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书