问题描述
这是wraps
包中的functools
函数的the doc。我浏览了此函数的源代码,想知道是否可以用装饰器方式重新实现它。我尝试过但失败了。
这是我的代码:
def wraps(f):
def wrapper(func):
def wrapped(*args,**kwargs):
for attr in ('__module__','__name__','__doc__'):
print getattr(f,attr)
setattr(func,attr,getattr(f,attr))
for attr in ('__dict__',):
print getattr(f,{})
getattr(func,attr).update(getattr(f,{}))
return func(*args,**kwargs)
return wrapped
return wrapper
def my_decorator(decorator_name):
def wrapper(func):
@wraps(func)
def wrapped(*args,**kwargs):
print '{}: {}'.format(decorator_name,wrapped.__dict__['wrapped_key1'])
return func(*args,**kwargs)
if 'wrapped_key1' in wrapped.__dict__:
wrapped.__dict__['wrapped_key1'] += 1
else:
wrapped.__dict__['wrapped_key1'] = 0
return wrapped
return wrapper
@my_decorator('outter')
@my_decorator('middle')
@my_decorator('inner')
def test(my_str):
print my_str
test('a')
outter: 2
middle: 1
inner: 0
a
我的工具的输出为:
outter: 0
middle: 0
inner: 0
a
哪里错了?
仅供参考,这是原始wraps
的源代码(删除了注释以节省空间)
WRAPPER_ASSIGNMENTS = ('__module__','__doc__')
WRAPPER_UPDATES = ('__dict__',)
def update_wrapper(wrapper,wrapped,assigned = WRAPPER_ASSIGNMENTS,updated = WRAPPER_UPDATES):
for attr in assigned:
setattr(wrapper,getattr(wrapped,attr))
for attr in updated:
getattr(wrapper,attr).update(getattr(wrapped,{}))
return wrapper
def wraps(wrapped,updated = WRAPPER_UPDATES):
return partial(update_wrapper,wrapped=wrapped,assigned=assigned,updated=updated)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)