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) のパラメーターがどこから来たのか理解できません。誰かが私にいくつかの指針を与えることができますか?

4

2 に答える 2

0

関数を装飾すると、リフレクションベースの操作で問題が発生し@wraps、ラップされた関数が元の関数を真にシミュレートするように設計されています。 提供されたリンクルセミアには、該当する情報があります。

于 2012-12-12T03:06:08.063 に答える
0

デコレーターは、引数の転送を伴う関数クロージャーの@wraps単なる構文糖衣です。*args位置引数のタプルを**kwargs参照し、 に渡されたすべてのキーワード引数の dict を参照しfuncます。

したがって、次の場合:

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

そしてした:

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

基本的には次のように呼び出します。

f(a, bar=z)

ただし、「with self._sync_lock:」コンテキストマネージャー内

于 2012-12-12T02:57:53.993 に答える