検索
連載

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

デコレーターを使うと、関数に何らかの追加機能を持たせられる。デコレーターの定義や、その使い方、同じことをするPythonコードについて見ていこう。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

引数を持つデコレーター

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

ページトップに戻る