前言:
exec函數可以吧字符串類型的對象解析執行(具體詳細的實現以及和eval的區別,此處不做闡述)
1、執行普通的引用
ss = 'print(1+2*(6-3)+4)'
exec(ss)
執行結果如下:
D:\Users\ttt\py37\python.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\ttt\py37\python.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\ttt\py37\python.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)
"""
2) 吧變量添加到全局變量中執行
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\ttt\py37\python.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\ttt\py37\python.exe D:/01work/02project/py_project/09practice/mili/aa/tt.py
16
Process finished with exit code 0