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 相关文章推荐
简单的Python2.7编程初学经验总结
Apr 01 Python
使用Python生成url短链接的方法
May 04 Python
RC4文件加密的python实现方法
Jun 30 Python
Python引用模块和查找模块路径
Mar 17 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
使用pyecharts无法import Bar的解决方案
Apr 23 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
不知道这5种下划线的含义,你就不算真的会Python!
Oct 09 Python
Python字符串的全排列算法实例详解
Jan 07 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 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
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
js实现一个简易计算器
2020/03/30 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
Python计算回文数的方法
2015/03/11 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python常用算法学习基础教程
2017/04/13 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
土木工程应届生自荐信
2013/09/24 职场文书
自我鉴定写作要点
2014/01/17 职场文书
军训自我鉴定100字
2014/02/13 职场文书
小学母亲节活动方案
2014/03/14 职场文书
小马王观后感
2015/06/11 职场文书
教师节表彰会主持词
2015/07/06 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
pytorch实现手写数字图片识别
2021/05/20 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
人民币符号
2022/02/17 杂记
vue+iview实现手机号分段输入框
2022/03/25 Vue.js
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL