9.1.2デコレーターの基本
高級関数とは
他の関数を引数として受け取る
他の関数を結果として返す
ですが、この高級関数は直感的ではないそうで、それをシンプルにしたものがデコレーターだそうです。
高級関数とは
他の関数を引数として受け取る
他の関数を結果として返す
ですが、この高級関数は直感的ではないそうで、それをシンプルにしたものがデコレーターだそうです。
>>> def log_func(func):
... def inner(*args, **keywds):
... print('------------------')
... print(f'Name: {func.__name__}')
... print(f'Args: {args}')
... print(f'Keywds: {keywds}')
... print('------------------')
... return func(*args, **keywds)
... return inner
...
>>> @log_func
... def hoge(x, y, m='bar', n='piyo'):
... print(f'hoge: {x}-{y}/{m}-{n}')
...
>>> hoge(15, 37, m='ほげ', n='ぴよ')
------------------
Name: hoge
Args: (15, 37)
Keywds: {'m': 'ほげ', 'n': 'ぴよ'}
------------------
hoge: 15-37/ほげ-ぴよ
>>>
1.最初に
log_funcという関数を定義しています。これは、別の関数funcを引数として受け取る高階関数です。この関数は、内部でinnerという新しい関数を定義し、それを返しています。2.inner関数は任意の引数とキーワード引数を受け取り、それらを表示した上で、元の関数funcをこれらの引数とともに呼び出します。3.次に
@log_funcという行が出てきます。これはデコレータの記法で、次に定義される関数に対してlog_funcを適用することを示しています。具体的には、この行の後に定義される関数hogeが実行される際に、その前後にlog_funcが定義する処理(ここではログの出力)を追加します。4.hoge関数は4つの引数を取り、それらを表示します。5.最後に、
hoge関数を特定の引数で呼び出しています。これにより、log_funcで追加されたログの出力と、hoge関数の本来の処理が順に実行されます。
なお、デコレータの記法は、以下の二つのコードが等価であることを覚えておくと理解が深まるかもしれません。
デコレータを用いた場合:
python@log_func def hoge(x, y, m='bar', n='piyo'): print(f'hoge: {x}-{y}/{m}-{n}')デコレータを用いずに同等の処理を書いた場合:
pythondef hoge(x, y, m='bar', n='piyo'): print(f'hoge: {x}-{y}/{m}-{n}') hoge = log_func(hoge)
コメント