看了「大道曙光」的《**functools模組wraps裝飾器的用途》的文章。基本上弄清了wraps的工作原理,為了檢驗一下自己理解的程度,於是動手寫乙個類似的 wraps函式,請大家指教。
#***************=測試***************====
debug_log = sys.stderr
def trace(func):
if debug_log :
@mywraps(func) #把被呼叫函式當作裝飾器函式的引數
def callfile(*args,**kwargs): #callfile 成了裝飾器函式的被呼叫函式
debug_log.write('function name:{}\n'.format(func.__name__))
debug_log.write('function args:{}\n'.format(args))
debug_log.write('callfile name:{}\n'.format(callfile.__name__))
res = func(*args,**kwargs)
return res
return callfile
else:
return func
@trace
def add(x,y):
''' return x+y '''
return x+y
print add(5,6)
print 'func name:',add.__name__
help (add)
#*****====執行結果********************=
function name:add
function args:(5, 6)
callfile name:add
11func name: add
help on function add in module __main__:
add(*args, **kwargs)
return x+y
help on function add in module __main__:
add(x, y)
return x+y
個人理解總結:mywraps 的作用就是裝飾器中的裝飾器,通過在裝飾器中把func的一系列屬性複製給callf,來達到在呼叫被裝飾過的add函式時,add 的屬性還是原來屬性。
乙個裝飾器裝飾乙個函式
2 如果鍵不存在,則新增到字典中。請使用裝飾器來實現,順便複習下 args和 kwargs的用法 a defselect func def inner args,kwargs if len args 0 if kwargs key in kwargs data print 鍵存在 else func...
帶函式的裝飾器 多個裝飾器裝飾乙個函式
一 帶引數的裝飾器 開關 author administrator f true defouter f def wap fun ggdef inner args,kwargs iff print inner before ret fun args,kwargs gg print inner afte...
裝飾器如何裝飾乙個函式
裝飾器如何裝飾乙個函式?今天番茄加速就來講一下。printstar函式接收乙個函式f,返回值也是乙個函式,所以滿足裝飾器的結構要求,所以printstar是乙個裝飾器。def printstar f def g print 20 f print 20 return g printstar裝飾器實現f...