9-2 如何为被装饰的函数保存元数据
解决方案:
使用标准库functools中的装饰器wraps 装饰内部包裹函数,可以
制定将原函数的某些属性,更新到包裹函数的上面
其实也可以通过
wrapper.name = func.name
update_wrapper(wrapper, func, (‘name‘,’doc‘), (‘dict‘,))
f.name 函数的名字
f.doc 函数文档字符串
f.module 函数所属模块名称
f.dict 函数的属性字典
f.defaults 默认参数元组
f.closure 函数闭包
from functools import wraps,update_wrapper
def log(level="low"):
def deco(func):
@wraps(func)
def wrapper(*args,**kwargs):
''' I am wrapper function'''
print "log was in..."
if level == "low":
print "detailes was needed"
return func(*args,**kwargs)
#wrapper.__name__ = func.__name__
#update_wrapper(wrapper, func, ('__name__','__doc__'), ('__dict__',))
return wrapper
return deco
@log()
def myFunc():
'''I am myFunc...'''
print "myFunc was called"
print myFunc.__name__
myFunc()