前言:
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
想要正常执行
- 待执行字符串中补充变量a
ss = """
c=7
print(a+b+c)
"""
- 吧变量添加到全局变量中执行
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