溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中如何設(shè)置與定義被裝飾函數(shù)參數(shù)

發(fā)布時(shí)間:2020-08-26 17:25:51 來(lái)源:億速云 閱讀:179 作者:Leah 欄目:編程語(yǔ)言

這篇文章運(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ò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI