如何在Python中以装饰方式重写wrap函数

问题描述

这是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')

functools.wraps输出是:

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 (将#修改为@)