Python使用eval函数执行动态标表达式过程详解

英文文档:

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)>}
>>>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解python eval函数的妙用

    python eval函数功能:将字符串str当成有效的表达式来求值并返回计算结果. 函数定义: eval(expression, globals=None, locals=None) 将字符串str当成有效的表达式来求值并返回计算结果.globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型:如果提供了locals参数,那么它可以是任意的map对象. python的全局名字空间存储在一个叫globals()的dict对象中:局部名字空间存储在

  • 详解python中eval函数的作用

    eval() 函数用来执行一个字符串表达式,并返回表达式的值. eval函数功能:将字符串str当成有效的表达式来求值并返回计算结果.eval函数可以实现list.dict.tuple与str之间的转化 eval() 方法的语法: eval(expression[, globals[, locals]]) 参数: expression -- 表达式. globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象. locals -- 变量作用域,局部命名空间,如果被提供,可以

  • 浅谈Python中eval的强大与危害

    eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果.想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果. python中eval函数的用法十分的灵活,但也十分危险,安全性是其最大的缺点.本文从灵活性和危险性两方面介绍eval. 1.强大之处 举几个例子感受一下,字符串与list.tuple.dict的转化. a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]&

  • python中eval与int的区别浅析

    python中eval和int的区别是什么?下面给大家介绍一下: 1.eval()函数 eval(<字符串>)能够以Python表达式的方式解析并执行字符串,并将返回结果输出.eval()函数将去掉字符串的两个引号,将其解释为一个变量. 作用: a. 处理数字 单引号,双引号,eval()函数都将其解释为int类型:三引号则解释为str类型. b.处理字符串类型的字符串 对于eval()括号中的的字符串(非数字),如果字符串带的是单引号或者是双引号都会引起NameError,这是因为eval(

  • python重要函数eval多种用法解析

    这篇文章主要介绍了python重要函数eval多种用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.参数会作为一个 Python 表达式(从技术上说是一个条件列表)被解析并求值 >>> x = 1 >>> eval('x+1') 2 2.去除字符串两边的引号 >>> a='"srting"' >>> print(a) "srting"

  • 解析Python中的eval()、exec()及其相关函数

    刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档.这里就来简单说一下这两个函数以及与它们相关的几个函数,如globals().locals()和compile(): 1. eval函数 函数的作用: 计算指定表达式的值.也就是说它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似. 函数定义: eval(expression, globals=None, local

  • 深度辨析Python的eval()与exec()的方法

    Python 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个. 大部分函数是我们经常使用的,例如 print().open() 与 dir(),而有一些函数虽然不常用,但它们在某些场景下,却能发挥出不一般的作用.内置函数们能够被"提拔"出来,这就意味着它们皆有独到之处,有用武之地. 因此,掌握内置函数的用法,就成了我们应该点亮的技能. 在<Python进阶:如何将字符串常量转为变量?>这篇文章中,

  • python3中eval函数用法使用简介

    python中eval函数的用法十分的灵活,这里主要介绍一下它的原理和一些使用的场合. 下面是从python的官方文档中的解释: The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object. The expression argument is parsed a

  • Python使用eval函数执行动态标表达式过程详解

    英文文档: 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

  • Python中zip()函数的解释和可视化(实例详解)

    zip()的作用 先看一下语法: zip(iter1 [,iter2 [...]]) -> zip object Python的内置help()模块提供了一个简短但又有些令人困惑的解释: 返回一个元组迭代器,其中第i个元组包含每个参数序列或可迭代对象中的第i个元素.当最短的可迭代输入耗尽时,迭代器将停止.使用单个可迭代参数,它将返回1元组的迭代器.没有参数,它将返回一个空的迭代器. 与往常一样,当您精通更一般的计算机科学和Python概念时,此模块非常有用.但是,对于初学者来说,这段话只会引发更

  • Python内置函数zip map filter的使用详解

    并行遍历zip zip会取得一个或多个序理为参数,然后返回元组的列表,将这些序列中的并排的元素配成对. L1=[1,2,3,4] L2=[5,6,7,8] L3=zip(L1,L2) print(L3,type(L3)) <zip object at 0x7feb81b17f08> <class 'zip'> zip在python3中是一个可迭代对象,我们可以将其包含在list调用中以例一次性显示所有结果 list(L3) [(1, 5), (2, 6), (3, 7), (4,

  • 基于python中pygame模块的Linux下安装过程(详解)

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查是否安装了pip 打开一个终端窗口,并执行如下命令: Python2.7中: zhuzhu@zhuzhu-K53SJ:~$ pip --version pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7) Python3.X中: z

  • Spring JDK动态代理实现过程详解

    这篇文章主要介绍了Spring JDK动态代理实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 创建项目 在 MyEclipse 中创建一个名称为 springDemo03 的 Web 项目,将 Spring 支持和依赖的 JAR 包复制到 Web 项目的 WEB-INF/lib 目录中,并发布到类路径下. 2. 创建接口 CustomerDao 在项目的 src 目录下创建一个名为 com.mengma.dao 的包,在该包下

  • python使用scapy模块实现ping扫描的过程详解

    关于scapy Scapy 是一个可以让用户发送.侦听和解析并伪装网络报文的Python程序.这些功能可以用于制作侦测.扫描和攻击网络的工具. 换言之, Scapy 是一个强大的操纵报文的交互程序.它可以伪造或者解析多种协议的报文,还具有发送.捕获.匹配请求和响应这些报文以及更多的功能. Scapy 可以轻松地做到像扫描(scanning).路由跟踪(tracerouting).探测(probing).单元测试(unit tests).攻击(attacks)和发现网络(network disco

  • Android动态使用VectorDrawable过程详解

    目录 导言 案例演示 问题解决 接上篇继续,讲解使用动态的VectorDrawable 上篇链接: Android三种方式生成矢量图之VectorDrawable类使用详解 导言 VectorDrawable有两个优点,一个是缩放不失真,另一个是使PNG的体积,大幅度减小,那么如果仅仅只有这两个优点,其实我是并不需要使用VectorDrawable,或者说,这并不能成为我们使用VectorDrawable的重要原因. 那我们使用它的重要原因是什么呢? 那就是VectorDrawable可以使用动

  • python中列表推导式与生成器表达式对比详解

    目录 概述 列表推导式 生成器表达式 使用场景选择 参考 总结 概述 Python中的列表推倒式(List Comprehension) 和 生成器表达式(Generator Expression)是两种很相似的表达式,但含义却不大不同,这里做一个对比. 列表推导式 列表推导式是比较常用的技术,能将本来需要for loop 和 if else 语句的情况简化成一条指令,最终得到一个列表对象: even = [e for e in range(10) if e % 2 == 0] 具体细节不过多展

  • Python绘制动态水球图过程详解

    先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEcharts之后,就可以将需要使用的模块进行导入: from pyecharts import options as optsfrom pyecharts.charts import Liquid 水球图数据很简单,就是一个完成率数字,所以不用定义或导入,也无需做转换. 接下来就可以绘制水球图了: c

  • Python实现字符型图片验证码识别完整过程详解

    1摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的防火墙功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 本文的基于传统的机器学习SVM的源码共享:https://github.com/zhengwh/captcha-svm 2关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3免责声明 本文研究所用素材来自于某旧Web框架的网

随机推荐