巧用partial,簡化帶引數裝飾器

2021-09-22 12:23:31 字數 958 閱讀 5930

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...