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
原文地址:https://www.cnblogs.com/wjlv/p/14276827.html