potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

Python 3.8 デコレータ(decorator)の基本的な動作

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。

Python 3.8にはデコレータと呼ばれる機能があります。代表的なものは@staticmethod@classmethodであり、@名前として関数やクラスの前に付けて使われます。

このデコレータ、実態は関数オブジェクトを返す関数なので自由に定義できます。例えば次のコードはtest_decoratorというデコレータを定義してfunc関数に設定しています。test_decoratorデコレータはスクリプト内部で自身が設定された関数funcに渡された名前なし引数と名前付き引数を表示して、funcを呼び出さずに終了します。

def test_decorator(f):
    def wrapper(*args, **kwargs):
        print(f"test_decorator({type(f)})")
        print(f"args: {args}")
        print(f"kwargs: {kwargs}")
        print("")
    return wrapper

@test_decorator
def func1():
    return

func1()
<#
test_decorator(<class 'function'>)
args: ()
kwargs: {}
#>

func1(123, arg1=456)
<#
test_decorator(<class 'function'>)
args: (123,)
kwargs: {'arg1': 456}
#>

上のコードのようにデコレータは関数に与えられた引数を受け取り、その内容を変更することができます。そちらは色々な方がデコレータの例として書かれているので、各自検索してみてください。