2012-12-12 43 views
0
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)中的參數來自哪裏。任何人都可以給我一些指點嗎?python:爲什麼在裝飾器中使用包裝?

+0

http://stackoverflow.com/questions/308999/what-does-functools-wraps-do – lucemia

回答

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:」 上下文管理器裏面

0

裝飾功能會導致基於反射的操作出現問題,並且@wraps被設計用於使封裝功能真正模擬原始功能。 The link lucemia提供了適用的信息。