[Python入門]デコレーターの基礎Python入門(2/2 ページ)

» 2019年11月26日 05時00分 公開
[かわさきしんじDeep Insider編集部]
前のページへ 1|2       

引数を持つデコレーター

 次にパラメーターを持つデコレーターについても見てみよう。つまり、以下のような書き方ができるデコレーターだ。ちょっとした理由からデコレーターの名前をここでは「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関数がパラメーターに受け取った値を利用している点に注目しよう。

実行結果 実行結果

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。