Python 関数の機能を拡張するデコレーターの使い方 

Pythonのデコレーターを使えば、関数に機能を追加できます。本記事では、その使い方を解説します。

Pythonで関数を使ってプログラムを作りたいのですが、機能を拡張する方法が分かりません。デコレーターって何ですか?

デコレーターは、既存の関数に新しい機能を追加したい場合に使われます。たとえば、ログを取りたいときや引数の型チェックをしたいときなど、関数に機能を追加することができます。

目次

デコレーターの使い方

Pythonでは、関数を受け取って新しい関数を返す関数を「デコレーター」と呼びます。デコレーターを使うことで、既存の関数に新しい機能を追加することができます。たとえば、ログを取りたいときや引数の型チェックをしたいときなど、関数に機能を追加することができます。

デコレーターを定義するには、次のように記述します。

def decorator(func):
    def wrapper(*args, **kwargs):
        # do something before the original function is called
        result = func(*args, **kwargs)
        # do something after the original function is called
        return result
    return wrapper

このように、デコレーター関数は、内部に新しい関数を定義し、それを返します。wrapper関数は、引数として受け取った関数を呼び出す前後に処理を追加することができます。

たとえば、ログを取るデコレーターを定義する場合は、次のようにします。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"call {func.__name__} with args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned {result}")
        return result
    return wrapper

このデコレーターを使うと、ログを取りながら関数を実行することができます。

@log_decorator
def add(x, y):
    return x + y

result = add(1, 2)
# call add with args=(1, 2), kwargs={}
# add returned 3

また、引数の型チェックをするデコレーターを定義する場合は、次のようにします。

def check_args_decorator(func):
    def wrapper(*args, **kwargs):
        # check args
        for arg in args:
            if not isinstance(arg, int):
                raise TypeError("args must be int")
        for arg in kwargs.values():
            if not isinstance(arg, int):
                raise TypeError("kwargs must be int")
        # call the original function
        return func(*args, **kwargs)
    return wrapper

このデコレーターを使うと、引数の型をチェックしながら関数を実行することができます。

@check_args_decorator
def add(x, y):
    return x + y

result = add(1, 2)
# pass
result = add(1, "2")
# TypeError: args must be int

 このように、デコレーターを使うことで、関数に機能を追加することができます。デコレーターは、関数の再利用性やメンテナンス性を向上させるための重要なPythonの機能の一つであるため、しっかりと使いこなすことが重要です。ただし、過剰な使用はコードの可読性を下げることがあるため、適切な場面で使うようにしましょう。

サンプルプログラムを使った解説

では、ログを取るデコレーターを使ったサンプルプログラムを用いて、より具体的な解説を行います。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"call {func.__name__} with args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned {result}")
        return result
    return wrapper

@log_decorator
def add(x, y):
    return x + y

result = add(1, 2)

上記のサンプルを解説します。

まず、以下のようにログを取るデコレーターを定義します。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"call {func.__name__} with args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned {result}")
        return result
    return wrapper

このデコレーターは、関数を受け取ってwrapper関数を返します。wrapper関数では、受け取った関数を呼び出す前後にログ出力の処理を追加しています。

次に、以下のようにログを取るデコレーターを適用した関数を定義します。

@log_decorator
def add(x, y):
    return x + y

このように、関数の定義前にデコレーターを適用することで、ログを取るデコレーターが適用されたadd関数が定義されます。

そして、以下のように関数を呼び出します。

result = add(1, 2)

このようにすると、add関数が呼び出され、ログが出力されます。

call add with args=(1, 2), kwargs={}
add returned 3

このように、ログを取るデコレーターを使うことで、関数が呼び出された時の引数や戻り値を確認することができます。

リスキリングでキャリアアップしてみませんか?

リスキリング(学び直し)は、経済産業省が推奨しており、

今だけ、最大70%のキャッシュバックを受けることができます。

リスキリング 給付金が出るスクール紹介

最大70%の給付金が出るおすすめのプログラミングスクール!

国策で予算が決められているため申し込みが多い場合は早期に終了する可能性があります!

興味のある方はすぐに確認しましょう。

まとめ

デコレーターの使い方を解説しました。

  • デコレーターは、関数に機能を追加するための仕組みである。
  • デコレーターは、既存の関数を受け取って新しい関数を返す関数である。
  • デコレーターは、@decoratorのように関数の定義前に記述することができる。
  • デコレーターは、関数の呼び出し前後に処理を追加することができる。
  • デコレーターを使うことで、ログを取ったり、引数の型チェックを行ったりすることができる。

デコレーターの使い方について具体的なサンプルコードもあって理解が深まりました。実際に実装するのに利用してみます。

デコレーターは、Pythonにおいて非常に重要な機能の一つです。関数に機能を追加したい場合には、デコレーターを上手に使いこなすことで、コードの可読性や再利用性、メンテナンス性などを向上させることができます。

しかし、適切な場面で使わなければ、コードの可読性が下がるなどの問題が生じることがあるため、注意が必要です。適切な場面で、上手にデコレーターを活用しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次