exec使用小計

前言:

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章