前言
最近在實現乙個裝飾器的過程中發現了乙個很有意思的地方,在部落格裡面分享出來
不同的寫法
三層函式巢狀,實現了可傳引數的乙個裝飾器。
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...