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

python:为什么在decorator中使用包装器?,python,decorator,Python,Decorator,代码在whoosh/src/util.py中,我无法理解synchronized_包装的效果以及synchronized_包装中的参数(self、*args、**kwargs)。有人能给我一些建议吗?对于带有参数转发的函数闭包来说,@wrapps装饰器只是语法上的糖分*args表示位置args的元组,**kwargs表示已传递给func的所有关键字args的dict 因此,如果您有: def synchronized(func): """Decorator for storage-acc

代码在whoosh/src/util.py中,我无法理解synchronized_包装的效果以及synchronized_包装中的参数(self、*args、**kwargs)。有人能给我一些建议吗?

对于带有参数转发的函数闭包来说,
@wrapps
装饰器只是语法上的糖分
*args
表示位置args的元组,
**kwargs
表示已传递给
func
的所有关键字args的dict

因此,如果您有:

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
而且:

def f(foo, bar=None):
    ...
这基本上就像打电话:

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

但是在带有self的“
。\u sync\u lock:
”上下文管理器中,修饰函数会导致基于反射的操作出现问题,而
@wrapps
的设计目的是使包装函数真正模拟原始函数。lucemia提供了适用的信息

f(a, bar=z)