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 第一步 hello world
Sep 25 Python
python字典快速保存于读取的方法
Mar 23 Python
Python字符串的一些操作方法总结
Jun 10 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
python MultipartEncoder传输zip文件实例
Apr 07 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
python数字图像处理之图像自动阈值分割示例
Jun 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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
php中explode与split的区别介绍
2012/10/03 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
js option删除代码集合
2008/11/12 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Python3的socket使用方法详解
2020/02/18 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
How to spawning asynchronous work in J2EE
2016/08/29 面试题
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
总经理秘书的岗位职责
2013/12/27 职场文书
股东协议书范本
2014/04/14 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
校运会新闻稿
2015/07/17 职场文书
Python socket如何解析HTTP请求内容
2022/02/12 Python
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers