在Python动态执行的函数中,eval是用于执行表达式计算的函数,这个函数用于执行字符串中包含的一个表达式或其编译后对应的代码,不能适用于执行Python语句和完整的代码。

一、    语法

1、    语法:eval(expression, globals=None, locals=None)

2、    参数说明:

1)    expression实参是一个字符串或compile编译好的表达式代码,如果是编译的代码,必须编译时模式指定为‘eval’,否则函数执行后返回None;

2)    globals:全局名字空间,必须是一个字典,可选参数;

3)    locals:局部名字空间或称为本地名字空间,可以是任何映射对象如字典。

特别说明:

4)    前面已经介绍了名字空间的概念,名字空间用字典类型来定义,此时在名字空间中的变量名就是该字典的键,变量值则是该键对应的值;

5)    如果省略 locals 字典则其默认值为 globals 字典。 如果两个字典同时省略,表达式会在 eval() 被调用的环境中执行;

6)    如果执行eval时,表达式中存在变量,则该变量的查找步骤为:去局部名字空间中查找->去全局名字空间中查找->去当前执行代码的空间查找。如果有一个步骤找到,则直接取该变量参与运算,否则到下一个名字空间中查找,都找不到则报错

3、    返回值:

1)    当正常执行时返回表达式对应的计算结果,语法错误将作为异常处理。

二、    举例:三种加法实现

1、    第一种方式:字符串表达式执行,没有使用全局空间和局部空间,不编译

def add1(a,b):  # 
    s='a+b'
    return eval(s)
        此时执行调用add1(1,2)返回3

2、    第二种方式:字符串表达式编译后执行,没有使用全局空间和局部空间

def add2(a,b):
s='a+b'
    c=compile(s,'<expression string>','eval')
    return eval(c)    

此时执行调用add2(1,2)返回3

3、    第三种方式:带全局空间和局部空间的字符串表达式编译后执行

def add3(a,b):
    s='a+b'
    c=compile(s,'<expression string>','eval')
    gArea,lArea = {},{}
    gArea['a']=str(a*10)
    gArea['b']=str(b*10)
lArea['a']=str(a*100)
    return eval(c,gArea,lArea)    #指定全局名字空间和局部名字空间

此时执行调用add3(1,2)返回’10020’。为什么是’10020’?我们一步步来解释:

1)    首先函数定义了2个参数和一个局部变量加法字符串,他们在函数所在的名字空间,经调用传参时,a=1,b=2;

2)    编译表达式(不编译直接执行字符串效果相同);

3)    下面定义了执行字符串对应代码的全局名字空间和局部名字空间gArea,lArea;

4)    给全局空间的变量a赋值为a*10(a=1)结果对应字符串‘10’,变量b赋值为字符串’20’;

5)    给局部名字空间的变量a赋值为’100’;

6)    此时执行编译代码,就是执行变量a+变量b,按照上面介绍的查找变量的方法,在局部名字空间中找到变量a,在全局名字空间中找到变量b,二者都是字符串,相加变成了字符串’100’+’20’的拼接,返回字符串’10020’

三种方法执行截屏:

 

本节老猿详细介绍了动态执行的eval函数及各个参数,并结合例子介绍了相关方法的使用。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第6.4节 Python动态表达式计算:eval函数详述的更多相关文章

  1. C#动态表达式计算

    C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...

  2. C#动态表达式计算(续2)

    上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...

  3. 第6.6节 Python动态执行小结

    一.    Python动态执行支持通过输入数据流或文件传入Python源代码串,进行编译后执行,可以通过这种方式扩展Python程序的功能: 二.    动态执行方法可能导致恶意攻击,因此使用时需要 ...

  4. [Python] 动态函数调用(通过函数名)

    2018-04-09 update 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real signature unknown & ...

  5. 第6.3节 Python动态执行之动态编译的compile函数

    Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...

  6. C#动态表达式计算(续1)

    距上一帖近五天时间,让大家久等了,没想到关注这个话题的也不少人,正如有同志所说的想解决该问题其实是有太多的解决方法,比如动态构造类编译.调用vbscript或者可以采用javascript解析引擎或者 ...

  7. 表达式计算-----------eval()运算符

    1.java的eval()方法(或称之为运算符)可以将字符串解析成可以运行的javaScript代码,例如 eval()只有一个参数.如果传入的参数不是一个字符串,那么它会直接返回这个参数.如果传入的 ...

  8. [转]动态管理视图和函数 (Transact-SQL)

    动态管理视图和函数返回可用于监视服务器实例的运行状况.诊断故障以及优化性能的服务器状态信息. 重要提示 动态管理视图和函数返回特定于实现的内部状态数据. 在未来的 SQL Server 版本中,它们的 ...

  9. 第6.5节 exec函数:一个自说自话的强大Python动态编译器

    在Python动态执行的函数中,exec是用于执行一个字符串内包含的Python源码或其编译后对应的字节码. 一.    语法 1.    exec(Code, globals=None, local ...

随机推荐

  1. 典型分布式系统分析:Dynamo

    本文是典型分布式系统分析系列的第四篇,主要介绍 Dynamo,一个在 Amazon 公司内部使用的去中心化的.高可用的分布式 key-value 存储系统. 在典型分布式系统分析系列的第一篇 MapR ...

  2. flex与bison的学习

    获取bison http://www.gnu.org/software/bison 获取flex http://flex.sourceforge.net/ 本书的范例 ftp://ftp.iecc.c ...

  3. Python调用Java(基于Ubuntu 18.04)

    最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...

  4. git 的一些常用命令

    1. git clone **(项目地址) 克隆一个git项目到本地,将git项目拉取到本地 2. git status 查看文件状态,列出当前目录没有被git管理,以及被修改过还未提交的文件 3. ...

  5. Future Callable 线程池 例1

    package com.niewj.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.Exec ...

  6. MySQL主从复制的原理和注意事项都在这儿了!!

    写在前面 最近在写Mycat专题,由于不少小伙伴最近要出去面试,问我能不能简单写下MySQL的主从复制原理和注意事项,因为在之前的面试中被问到了这些问题.我:可以啊,安排上了!! 主从复制原理 (1) ...

  7. python pip install指定国内源镜像

    有时候安装一些依赖包,网不好,直接超时,或者这个包就是死都下不下来的时候,可以指定国内源镜像. pip install -i 国内镜像地址 包名 e.g. pip install -i  http:/ ...

  8. 痞子衡嵌入式:JLink Script文件基础及其在IAR下调用方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是JLink Script文件基础及其在IAR下调用方法. JLink可以说是MCU开发者最熟悉的调试工具了,相比于其他调试器(比如DAP ...

  9. Charles mock数据详解

    Charles是一款非常好用的代理工具,关于Charles的安装.破解.安装证书,连接手机代理等使用方法详见我之前的博客:https://www.cnblogs.com/feng0815/p/8043 ...

  10. metasploit数据库使用学习

    metasploit为了方便,自动将当前工作区的内容放入数据库 首先就是工作区 -a 增加工作区,-d删除工作区 不同工作区的内容会分开储存到数据库 default工作区 test工作区 db_imp ...