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实现冒泡,插入,选择排序简单实例
Aug 18 Python
Python中os.path用法分析
Jan 15 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
python切片及sys.argv[]用法详解
May 25 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
新手学python应该下哪个版本
Jun 11 Python
Python依赖包迁移到断网环境操作
Jul 13 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
python爬取音频下载的示例代码
Oct 19 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 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中关于socket的系列函数总结
2015/05/18 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
javascript中Function类型详解
2015/04/28 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
python获取当前日期和时间的方法
2015/04/30 Python
Python操作串口的方法
2015/06/17 Python
python 实现逻辑回归
2020/12/30 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
Shell如何接收变量输入
2012/09/24 面试题
函授自我鉴定
2013/11/06 职场文书
管理科学大学生求职信
2013/11/13 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
带薪年假请假条
2014/02/04 职场文书
班主任班级寄语大全
2014/04/04 职场文书
网吧员工管理制度
2015/08/05 职场文书
同学聚会祝酒词
2015/08/10 职场文书