python帶引數裝飾器的兩種寫法

2021-10-21 20:44:38 字數 2772 閱讀 5816

前言

最近在實現乙個裝飾器的過程中發現了乙個很有意思的地方,在部落格裡面分享出來

不同的寫法

三層函式巢狀,實現了可傳引數的乙個裝飾器。

import logging

import functools

deflogger

(msg=

none):

"""日誌"""

defdector

(func)

: @functools.wraps(func)

def(

*args,

**kwargs)

: result = func(

*args,

**kwargs)

logging.info(func.__name__ + func.__doc__)

logging.info(f"引數:"

)if msg:

log.info(msg.

format

(result)

)return result

return dector

使用functools.partial函式實現了乙個比較抽象的三層帶引數裝飾器。

import logging

import functools

defloggers

(func=

none

, msg=

none):

"""日誌"""

if func is

none

:return functools.partial(loggers, msg=msg)

@functools.wraps(func)

def(

*args,

**kwargs)

: result = func(

*args,

**kwargs)

logging.info(func.__name__ + func.__doc__)

logging.info(f"引數:"

)if msg:

log.info(msg.

format

(result)

)return result

有何異同可以看到從**的閱讀層面來講,第乙個寫法是比較易讀的,第二種寫法不容易閱讀。從執行呼叫方面第二種更簡單點。

先看以下第一種呼叫執行的方式:

裝飾器傳引數

'''

'''@loggers(msg=

'hello {}'

)def

demo

(name)

:"""演示函式"""

print

("你好%s"

裝飾器不傳引數

@loggers(

)def

demo

(name)

:"""演示函式"""

print

('你好%s'

裝飾器不帶引數

'''

'''@logger

defdemo

(name)

:"""演示函式"""

print

("你好%s"

裝飾器帶引數

@logger(msg=

' hello {}'

)def

demo

(name)

:"""演示函式"""

print

("你好%s"

可以看到使用了functools.partial函式的裝飾器,在呼叫非必填引數時,可以不用使用括號。

除了寫法理解比較抽象,這樣的呼叫還是比較友好的。

Python 兩種裝飾器

目錄 帶引數的裝飾器 函式 類裝飾器 裝飾器 decorators 是 python 的乙個重要部分。簡單地說 他們是修改其他函式的功能的函式。他們有助於讓我們的 更簡短,也更pythonic python範兒 來想想這個問題,難道 wraps不也是個裝飾器嗎?但是,它接收乙個引數,就像任何普通的函...

python裝飾器兩種方式

1.普通裝飾器 def decorate fun 普通裝飾器 param fun return def inner args,kwargs print 呼叫裝飾器之前 fun args,kwargs print 呼叫裝飾器之後 return inner decorate method decorat...

python 帶引數裝飾器

在前面一文 python裡為什麼需要使用裝飾器 decorator 裡,我們學習了為什麼需要裝飾器,知道裝飾器就是為了不修改原來函式的 又達到增加功能的作用。其實為了裝飾器更通用化,那麼裝飾器是否也可以帶引數呢?其實是可以的,這樣更加通用化了,達到共享極點。在前面也學習 為什麼要使用閉包 closu...