初めはPythonのデコーレータについて。
1. 関数を返り値にした時の挙動
例えば以下のようなとき
“`
def foo()
def bar(a, b)
return a + b
return bar
“`
このとき、
“`
>a = foo()
>a(1, 2)
3
“`
という値が返る。
a=foo()
の時点で、aの中身は関数barそのものとなっている。
従ってaは引数を取ることが出来、上記のような値が返る。
2. デコレータについて
デコレータとは、
“`
@wrapper
def function()…
“`
のように、@をおいて定義されるラッパーのようなものである。
例えば
“`
def foo(func):
def bar(a, b):
return func(a + b)
return bar
“`
であったときに、
“`
@foo
def sq(x):
return x^2
“`
とおくと、内部的には
“`
sq = foo(sq)
“`
と同値である。
気持ちとしては、デコレータはまさに定義する関数のラッパーのようなもので、
その出力などを変更したり、判定を追加したりしたいときに使う。
ちなみにこのとき、sqは
“`
>sq(5,1)
36
“`
と出力される。