您好,登錄后才能下訂單哦!
這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹Python中如何設(shè)置與定義被裝飾函數(shù)參數(shù),代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
被裝飾函數(shù)參數(shù)的設(shè)置與定義
先來(lái)看一段代碼
import time def timmer(func): def inner(): start_time=time.time() func() end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name)
如上所示,home函數(shù)添加了一個(gè)參數(shù),而index函數(shù)并沒(méi)有參數(shù)。按照正常的函數(shù)的定義與調(diào)用方式,調(diào)用index函數(shù)和home函數(shù)的方式應(yīng)該是下面這種形式:
index() home("python")
然后我們運(yùn)行程序就會(huì)發(fā)現(xiàn),程序拋出了異常。
File "E:\python_learn\py_code\test.py", line 28, in <module> home("python") TypeError: inner() takes 0 positional arguments but 1 was given
說(shuō)個(gè)異常說(shuō)明inner函數(shù)不需要位置參數(shù),但是我們給了一個(gè)位置參數(shù)?;氐絫immer裝飾器定義的部分,可以看到,timmer裝飾器的內(nèi)部函數(shù)確實(shí)沒(méi)有定義參數(shù)。這樣一來(lái),timmer裝飾器只能用于裝飾沒(méi)有參數(shù)的函數(shù)了,我們可以在timmer裝飾器定義的時(shí)候?yàn)閕nner函數(shù)添加一個(gè)參數(shù)。
import time def timmer(func): def inner(name): start_time=time.time() func(name) end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) index() home("python")
但是這樣一來(lái),timmer裝飾器裝飾index函數(shù)的時(shí)候又會(huì)拋出異常,因?yàn)閕ndex函數(shù)沒(méi)有參數(shù)。
File "E:\python_learn\py_code\test.py", line 27, in <module> index() TypeError: inner() missing 1 required positional argument: 'name'
在不知道被裝飾函數(shù)的參數(shù)個(gè)數(shù)的情況下,即被裝飾函數(shù)的參數(shù)可變長(zhǎng),且形式不固定的時(shí)候,可以使用*args和**kwargs,把上面的代碼修改:
import time def timmer(func): def inner(*args,**kwargs): start_time=time.time() func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) index() home("python")
再次運(yùn)行程序,查看運(yùn)行結(jié)果:
welcome to index page run time: 2.0 welcome to python home page run time: 3.0
由上可知,在不知道被裝飾函數(shù)的參數(shù)個(gè)數(shù)時(shí),可以使用*args和**kwargs來(lái)表示任意長(zhǎng)度任意形式的參數(shù)。
被裝飾函數(shù)的返回值
修改上面的代碼,為home函數(shù)定義一個(gè)返回值,分別打印index函數(shù)和home函數(shù)的返回值。
import time def timmer(func): def inner(*args,**kwargs): start_time=time.time() func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) return("home func") index_res=index() print(index_res) home_res=home("python") print(home_res)
運(yùn)行程序,可以看到:
welcome to index page run time: 2.0 None welcome to python home page run time: 3.0 None
可以看到,home函數(shù)中定義的返回值并沒(méi)有被打印出來(lái),顯示的值為None。因?yàn)檫@里執(zhí)行的home函數(shù)不是原始定義的home函數(shù),而是wrapper函數(shù)的執(zhí)行結(jié)果。因?yàn)閣rapper函數(shù)并沒(méi)有定義返回值,所以執(zhí)行被裝飾后的home函數(shù)并沒(méi)有打印出返回值。
修改代碼,在timmer裝飾器中定義并返回被裝飾函數(shù)執(zhí)行的返回值。
import time def timmer(func): def inner(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return res return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) return("home func") index_res=index() print(index_res) home_res=home("python") print(home_res)
再次執(zhí)行函數(shù),查看執(zhí)行結(jié)果:
welcome to index page run time: 2.0 None welcome to python home page run time: 3.0 home func
可以看來(lái),原始home函數(shù)中定義的返回值被打印出來(lái)了。
結(jié)論:
(1)如果被裝飾函數(shù)沒(méi)有定義返回值,timmer裝飾器裝飾后的返回值為None。
(2)如果被裝飾函數(shù)定義了返回值,則timmer裝飾器裝飾后則返回被裝飾函數(shù)的返回值。
關(guān)于Python中如何設(shè)置與定義被裝飾函數(shù)參數(shù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。