連載
» 2019年11月26日 05時00分 公開

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

[かわさきしんじ,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.

編集部からのお知らせ

8月8日10時30分〜16時30分の間、システムメンテナンスのため記事の一部表示や資料のダウンロードができなくなります。ご理解のほどよろしくお願いいたします。

RSSについて

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

メールマガジン登録

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