from functools import wraps, partial
import logging
deflogged
(func=
none,*
, level=logging.debug, name=
none
, message=
none):
if func is
none
:return partial(logged, level=level, name=name, message=message)
# 最重要的一句 省了一層**
logname = name if name else func.__module__
log = logging.getlogger(logname)
logmsg = message if message else func.__name__
@wraps(func)
def(
*args,
**kwargs)
: log.log(level, logmsg)
return func(
*args,
**kwargs)
# @logged # 這裡就可以不加括號了
# def hello():
# return 'hello no parame'
@logged(level=logging.critical, name=
'example'
)def
hello()
:return
'hello parames'
hello(
)
帶引數裝飾器第一次沒有傳入func 也就是說func為none 返回了乙個繫結了引數的logged,繼續執行,相當於內層裝飾函式執行,這樣就巧妙的省了一層**。 裝飾器帶引數
裝飾器帶引數 帶引數的裝飾器是三層的 最外層的函式負責接受裝飾器引數 裡面的內容還是源裝飾器的內容 def outer a 第一層 負責接受引數的 defdecorate func 第二層 負責接受函式的 def wargs,kwargs 第三層 負責接受函式的引數 func wargs print...
裝飾器 帶引數
如果明白裝飾器的原理那麼帶引數的裝飾器就很容易理解了 def s1 func definner a,b f1 inner a,b 接受2個引數,然後在把2個引數傳遞給func a,b print hello r func a,b print word return r return inner s1...
python 帶引數裝飾器
在前面一文 python裡為什麼需要使用裝飾器 decorator 裡,我們學習了為什麼需要裝飾器,知道裝飾器就是為了不修改原來函式的 又達到增加功能的作用。其實為了裝飾器更通用化,那麼裝飾器是否也可以帶引數呢?其實是可以的,這樣更加通用化了,達到共享極點。在前面也學習 為什麼要使用閉包 closu...