python:为什么在装饰器中使用包装器?

时间:2012-12-12 02:13:30

标签: python decorator

def synchronized(func):
    """Decorator for storage-access methods, which synchronizes on a threading
    lock. The parent object must have 'is_closed' and '_sync_lock' attributes.
    """

    @wraps(func)
    def synchronized_wrapper(self, *args, **kwargs):
        with self._sync_lock:
           return func(self, *args, **kwargs)

    return synchronized_wrapper

代码在whoosh / src / util.py中,我无法理解synchronized_wrapper的效果以及synchronized_wrapper(self,* args,** kwargs)中的参数。谁能给我一些指示?

2 个答案:

答案 0 :(得分:0)

@wraps装饰器只是带有参数转发的函数闭包的语法糖。 *args指的是位置参数的元组,而**kwargs指的是已传递给func的所有关键字参数的字典。

因此,如果你有:

def f(foo, bar=None):
    ...

并做了:

sync_f = someinst.synchronized(f)
sync_f(a, bar=z)

它基本上就像打电话:

f(a, bar=z)

但在“with self._sync_lock:”上下文管理器

答案 1 :(得分:0)

修饰函数会导致基于反射的操作出现问题,@wraps旨在使包装函数真正模拟原始函数。 The link提供的lucemia具有适用信息。