パラメータ付きPythonデコレータ


前の記事でPython decorator series , 我々はデコレータ、どのように動作し、簡単な機能ベースのデコレータとクラスベースのデコレータを実装するために学習している.この記事ではパラメータをサポートするデコレータを作成することを学びます.

パラメータによる関数ベースのデコレータ


from functools import wraps


def hello_decorator(num):
    """Simple decorator function that supports parameters"""

    def inner_func(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            """Simple decorator wrapper function"""
            result = func(*args, **kwargs)
            result = result + num
            return result
        return wrapper
    return inner_func


@hello_decorator(100)
def add(a, b):
    """Simple function that returns sum of two numbers"""
    return a + b


@hello_decorator(200)
def multiply(a, b):
    """Simple function that returns multiplication of two numbers"""
    return a * b


if __name__ == '__main__':
    output1 = add(2, 2)
    print('Result:: ', output1)
    print("=" * 25)

    output2 = multiply(4, 2)
    print('Result:: ', output2)


このように、構造は以前の例とは少し異なります.
  • パラメータをとるデコレータ@hello_decorator(100) - これは、我々が我々の装飾家に引数を渡すことができる方法です
  • hello_decorator 関数は内部関数を返す.
  • inner_func 関数は引数として修飾され、ラッパー関数を返します.
  • ラッパー関数はadd 関数と引数に基づいて出力を操作するresult = result + num を返します.
  • パラメータを持つクラスベースのデコレータ


    from functools import wraps
    
    
    class HelloDecorator:
        """Simple class decorator"""
    
        def __init__(self, num):
            self.num = num
    
        def __call__(self, func):
            @wraps(func)
            def wrapper(*args, **kwargs):
                """Simple class call method"""
                result = func(*args, **kwargs)
                result = result + self.num
                return result
            return wrapper
    
    
    @HelloDecorator(100)
    def add(a, b):
        """Simple function that returns sum of two numbers"""
        return a + b
    
    
    @HelloDecorator(200)
    def multiply(a, b):
        """Simple function that returns multiplication of two numbers"""
        return a * b
    
    
    if __name__ == '__main__':
        output1 = add(2, 2)
        print('Result:: ', output1)
    
        output2 = multiply(4, 2)
        print('Result:: ', output2)
    
    このクラスベースのパラメータを持つデコレータは、単純な関数ベースのデコレータと非常によく似ています.このメソッドで最高のものは、私たちは余分なboilerplateコードをdoc文字列を修正する必要はありません.
    だから今では引数を持つデコレータを実装するには、クラスベースのアプローチを好む.それは非常に直感的であり、追加の内部機能と追加のboilerplateコードを修正する必要はありませんdocs.
    これまでの例では、基本的なデコレータの実装を例に挙げました.次の記事では、様々な種類のデコレータのレシピを実装します.今後の記事をお楽しみください.ニュースレターを購読し、私の将来の記事を得るために私と接続します.