次にパラメーターを持つデコレーターについても見てみよう。つまり、以下のような書き方ができるデコレーターだ。ちょっとした理由からデコレーターの名前をここでは「f1」としよう。
@f1('foo')
def some_func(msg):
print(msg)
このときにf1関数の定義はどうなるだろうか。実は、パラメーターを持つデコレーターの定義はちょっと面倒なことになる。実際のコードをご覧いただこう。
def f1(msg='foo'):
def inner_func(func):
def most_inner_func(*arg):
print(f'msg: {msg}')
print('most_inner_func')
result = func(*arg)
return most_inner_func
return inner_func
どういうことか分かるだろうか。最も外側のf1関数では、デコレーターが受け取るパラメーターだけを受け取り、その内部で、関数を受け取り関数を返すinner_fun関数(デコレーター)を返送している。そして、inner_func関数の内部では、f1関数とinner_func関数がパラメーターに受け取った値を利用する関数を定義して、それを返送するようになっている。
関数定義がネストしているので少々分かりにくいが、パラメーターを持つデコレーターはこのようにして定義する。最初にデコレーターとは「関数を受け取り、関数を戻り値とする関数」と述べたが、パラメーターを持たせる場合には、このように大外では関数を受け取らない代わりに、関数を受け取り、関数を戻り値とする関数を返すことで、同じ効果が得られる。
上にも示したが、このデコレーターを使用するには次のようなコードを書く。
@f1('bar')
def some_func(msg):
print(msg)
some_func('hello world')
これを実行すると次のようになる。most_inner_func関数内でf1関数とinner_func関数がパラメーターに受け取った値を利用している点に注目しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.