• exec使用小计


    前言:
    exec函数可以吧字符串类型的对象解析执行(具体详细的实现以及和eval的区别,此处不做阐述)

    1、执行普通的引用

    ss = 'print(1+2*(6-3)+4)'
    exec(ss)
    

    执行结果如下:

    D:Users	ttpy37python.exe D:/01work/02project/py_project/09practice/mili/aa/tt.py
    11
    
    Process finished with exit code 0
    

    2、指定变量范围去执行

    a. 不指定变量作用域

    ss = """
    c=7
    print(a+b+c)
    """
    
    a = 15
    b = 6
    
    
    def run():
        b = 3
        c = 4
        # 不指定变量作用域时,遵循由内到外查找的方式,此处a:15,b:3,c:7。无论是否指定,待执行字符串中的变量均会优先使用,即c=7
        exec(ss)
    
    
    run()
    

    执行结果如下:

    D:Users	ttpy37python.exe D:/01work/02project/py_project/09practice/mili/aa/tt.py
    25
    
    Process finished with exit code 0
    

    b.仅指定全局变量

    ss = """
    c=7
    print(a+b+c)
    """
    
    a = 15
    b = 6
    
    
    def run():
        b = 3
        c = 4
        # 仅指定全局变量时,除待执行字符串中解析出来的变量外,仅从提供的全局变量中查找变量
        exec(ss, {'b': 4})  # 此处待执行字符串中仅有c=7,而全局变量仅提供了b=4,变量a不存在于全局变量和待执行字符串,会报错
    
    
    run()
    

    执行结果如下:

    D:Users	ttpy37python.exe D:/01work/02project/py_project/09practice/mili/aa/tt.py
    Traceback (most recent call last):
      File "D:/01work/02project/py_project/09practice/mili/aa/tt.py", line 65, in <module>
        run()
      File "D:/01work/02project/py_project/09practice/mili/aa/tt.py", line 62, in run
        exec(ss, {'b': 4})  # 此处待执行字符串中仅有c=7,而全局变量仅提供了b=4,变量a不存在于全局变量和待执行字符串,会报错
      File "<string>", line 3, in <module>
    NameError: name 'a' is not defined
    
    Process finished with exit code 1
    

    想要正常执行

    1. 待执行字符串中补充变量a
    ss = """
    c=7
    print(a+b+c)
    """
    
    1. 吧变量添加到全局变量中执行
    exec(ss, {'b': 4, 'a': 6})
    

    (3. 吧变量添加到局部变量中)

    exec(ss, {'b': 4},{'a': 6})
    

    c.指定局部变量

    ss = """
    c=7
    print(a+b+c)
    """
    
    a = 15
    b = 6
    
    
    def run():
        b = 3
        c = 4
        # 仅指定局部变量(全局变量为空)时,变量优先级:待解析字符串>指定的局部变量>指定的全局变量,不再从程序其他位置获取变量
        exec(ss, {}, {'a': 6})  # 此处待执行字符串中有待解析字符串中包含的c=7,而局部变量提供的a=6,变量b不存在于待执行字符串、局部变量、全局变量,会报错
    
    
    run()
    

    执行结果如下:

    D:Users	ttpy37python.exe D:/01work/02project/py_project/09practice/mili/aa/tt.py
    Traceback (most recent call last):
      File "D:/01work/02project/py_project/09practice/mili/aa/tt.py", line 65, in <module>
        run()
      File "D:/01work/02project/py_project/09practice/mili/aa/tt.py", line 62, in run
        exec(ss, {}, {'a': 6})  # 此处待执行字符串中有待解析字符串中包含的c=7,而局部变量提供的a=6,变量b不存在于待执行字符串、局部变量、全局变量,会报错
      File "<string>", line 3, in <module>
    NameError: name 'b' is not defined
    
    Process finished with exit code 1
    

    想要执行正常,可以吧变量b添加到待执行字符串、局部变量、全局变量均可,此处不再做演示。

    3、验证一下变量取值优先级

    ss = """
    c=7
    print(a+b+c)
    """
    
    a = 15
    b = 6
    
    
    def run():
        b = 3
        c = 4
        # 此处虽然有多个变量值,但结合优先级(待执行字符串>局部变量>全局变量)可以知道取值分别为a=4,b=5,c=7
        exec(ss, {'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6})
    
    
    run()
    

    运行结果为:

    D:Users	ttpy37python.exe D:/01work/02project/py_project/09practice/mili/aa/tt.py
    16
    
    Process finished with exit code 0
    
  • 相关阅读:
    docker node中uid与gid的授权问题
    windows下docker无法进行端口映射的问题
    IOS/Safari下document对象的scrollHeight值比Chrome更大
    Vue/Egg大型项目开发(二)数据库设计
    .babelrc和babel.config.js的相同配置不能合并
    es6 class中责任链模式与AOP结合
    JS设计模式(10)职责链模式(重要)
    Vue/Egg大型项目开发(一)搭建项目
    你不知道的JS(3)来聊聊this
    CentOS7为php7.2安装php-redis扩展(redis环境搭建二)
  • 原文地址:https://www.cnblogs.com/wjlv/p/14276827.html
Copyright © 2020-2023  润新知