• 【python】python内置函数——eval()/exec()执行一个字符串形式的python表达式


    目录

    1.eval()和exec()简单介绍

    2.eval()和exec()语法介绍

    3. eval()和exec()使用场景


    1.eval()和exec()简单介绍

    eval()和exec()两个函数功能相似,可以执行一个字符串形式的python表达式,相当于一个python的解释器

    eval()和exec()的不同在于:eval()执行完要返回结果,而exec()执行完不返回结果。

    2.eval()和exec()语法介绍

    eval()语法格式:

    eval(expression[, globals[,locals]])

    exec()语法格式:

    exec(expression,globals=None,locals=None)

    二者参数一样,参数说明:

    •         - expression:是一个字符串,是要计算的表达式,
    •         - globals:变量作用域,全局命名空间,如果被提供,必须是一个字典对象,如果不提供该参数,使用python的全局命名空间
    •         - locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象,如果不提供该参数,默认为globals提供的全局命名空间

    返回值:返回表达式计算的结果

    ⚪ 不使用globals和locals参数:

    1. print('2*3=',eval('2*3'))
    2. print('2**3=',eval('2**3'))
    3. print('pow(3,2)=',eval('pow(3,2)'))
    4. n=3
    5. print('n+9=',eval('n+9'))
    6. n='3'
    7. print('n*9=',eval('n*9'))

    显示结果:

    1. 2*3= 6
    2. 2**3= 8
    3. pow(3,2)= 9
    4. n+9= 12
    5. n*9= 333333333

    ⚪ 使用globals参数:

    1. dic={}
    2. dic['b'] = 3
    3. print(dic.keys())
    4. exec('a=4',dic)
    5. print(dic.keys())

    显示结果:

    1. dict_keys(['b'])
    2. dict_keys(['b', '__builtins__', 'a'])

    可以看到,exec(0函数中在作用域dic下执行了a=4的代码。执行完exec()后dic中新生成了两个新的key,分别是a和__builtins__,a是执行语句生成的,__builtins__是系统加入的内置key。

    ⚪ 使用locals参数:

    1. a=10
    2. b=20
    3. c=30
    4. g={'a':6,'b':8}
    5. t={'b':100,'c':10}
    6. print(eval('a+b+c',g,t))

    显示结果:

    1. 116
    2. None

    g是global全局命名变量,t是local局部命名变量,如果设置了local参数,则使用local,否则使用globals。表达式是a+b+c,t中包含b和c,g中包含a和b,那么a=6,b=100,c=10。b=100是因为要使用t中的变量,不能使用g中的变量。所以最终结果返回116。

    从上面的返回结果可以看出,exec()执行完不返回结果,eval()执行完会返回结果。所以exec()中适合放置运行后没有结果的语句,eval()中适合放置有结果返回的语句。

    如果eval()中表达式是没有返回值的参数,会报错:SyntaxError: invalid syntax。如:

    print(eval('a=2'))

    会有以下错误:

    1. print(eval('a=2'))
    2. File "", line 1
    3. a=2
    4. ^
    5. SyntaxError: invalid syntax

    3. eval()和exec()使用场景

    使用python开发服务端程序时,这两个函数使用的比较多。例如,客户端向服务端发送一段字符串代码,服务端无需关心具体的内容,直接跳过exec()和eval()来执行,这样设计可以使服务端与客户端的耦合度更低,系统更易扩展。

    但是需要注意的是,使用eval()或是exec()处理请求代码时,这两个啊哈桑农户常常会被黑客利用,称为可以执行系统级命令的入口点,进而来攻击网站。解决方法是:通过设置其命名空间里的可执行函数,限制eval()和exec()的执行范围。

    全文参考:

    Python eval() 函数 | 菜鸟教程 (runoob.com)

    Python eval()和exec()函数详解 (biancheng.net)

  • 相关阅读:
    编译期间生成代码(Lombok原理)
    前端代码统计工具之cloc介绍
    Mybatis---从入门到深化
    Unet语义分割-语义分割与实例分割概述-001
    宇视网络视频录像机添加摄像机提示离线
    code2vec 代码的连续分布式矢量表示
    Java基础面试-IOC
    wsl端口转发远程链接
    配置多仓库根目录(阁瑞钛伦特软件-九耶实训)
    Vue基础入门
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/126477651