• Python内置函数--exec()


    它与eval()类似

    源码

    def exec(
        __source: str | bytes | CodeType, __globals: dict[str, Any] | None = ..., __locals: Mapping[str, Any] | None = ...
    ) -> Any: ...
    
    • 1
    • 2
    • 3

    1、源可以是表示Python表达式的字符串或编译器()返回的代码对象
    2、全局:全局必须是字典
    3、局部变量:局部可以是任何映射***

    小例子

    q = 3
    g = {"n":9}
    l = {}
    exec("a=1+1", g, l)
    print(l)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    i是全局名称空间,g是局部名称空间。它会将第一个参数产生的值存入到局部中,我们可以通过打印局部得到结果。

    如果没有a亦或者局部中本来就存在一个键值对呢,一起看看:

    """g中有值"""
    q = 3
    g = {"n": 9}
    l = {"b": 1}
    exec("1+1", g, l)
    print(l)
    # {"b": 1}
    """g中无值"""
    q = 3
    g = {"n": 9}
    l = {}
    exec("1+1", g, l)
    print(l)
    # {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    全局

    当我不定义全局以及局部的时候:

    q = 3
    g = {"n": 9}
    l = {}
    exec("a=1+1")
    print(l)
    print(a)
    """
    {}
    2
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在编译器上a会提示你有误(红色下划线)。但是依然可以输出。
    前面说了,是默认传入局部的,但是上述错处本身就在全局,所以全局打印是可以得到结果的。

    局部

    def func():
        q = 3
        g = {"n": 9}
        l = {}
        exec("a=1+1")
        print(l)
        print(a)
    func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这样是不被允许的。错误提示:NameError: name ‘a’ is not defined,名字没有定义。为什么呢?
    在上述中,全局中使用局部是被允许的,那是因为在这背后有一个绑定的过程,全局使用locals等同于使用globals。
    exec(“a=1+1”),其默认是:exec(“a=1+1”,globals(),locals())。在上述中,需要分清的是,locals的值并未与当前的局部空间绑定,所以func函数不认识a。所以我们可以传入g,l进去绑定一下:

    def func():
        q = 3
        g = {"n": 9}
        l = {}
        exec("a=1+1",g,l)
        print(l)
    func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    axios的基本使用
    Centos / Ubuntu 自启动服务 - 测试记录 - 杂记
    渗透测试-信息收集DNSenum简介与常见参数
    C语言面试题值反转字符串
    【计算机网络黑皮书】传输层
    想读项目源码?可为什么总是读不下去?
    ElementUI之动态树+数据表格+分页
    api安全测试的学习
    目标检测 YOLOv5 - YOLOv5的后处理
    “益路同行”栏目专访第11期——柳州市雨花敬老服务中心陈勇梅
  • 原文地址:https://blog.csdn.net/weixin_52040868/article/details/127946244