2016-06-28 41 views
1

一般的なデコレータイディオムの明示的な置き換えが必要です。明示的な関数で定義されたパラメータを持つメタデコレータ

長年にわたって多くのコードベースに説明なしcopy-pastedてきた巧妙な1行のデコレータがあります:これで

decorator_with_args = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs) 

私の問題は、正確にthat it is cleverです:それは、それが何をするかについては何も説明していません命名されていない多くの動いている部分は、それは明白ではなく、表現力が欠けています。

2005年のPeter Huntのwidely-cited ActiveState recipeでさえ、これが内部で何をしているのか、その部品の名前が何であるべきかについては何の手がかりも与えていません。

私はよりPythonicで、より明示的で表現力豊かな置換を見たいと思います。

答えて

1

私はかなりオリジナルの詳細は仕事に意図されているかわからないので、私はこの間違って持っていることがあります。

import functools 

def decorator_with_arguments(decorator): 
    """ Wrap a decorator, allowing it to accept arbitrary arguments. """ 

    @functools.wraps(decorator) 
    def wrapper(*args, **kwargs): 
     """ The resulting decorator that accepts arbitrary arguments. """ 

     def _function(func): 
      """ Invoke the original decorator with the arguments. """ 
      return decorator(func, *args, **kwargs) 

     return _function 

    return wrapper 

は、これらの部品のためのより良い名前を提案してくださいをし、任意のバグを指摘する(すなわち元のものとは異なる動作)。

関連する問題