ただの関数
def hoge():
print "aaaaaaabb"
hoge()
aaaaaaabb
なんの変哲もないですね。
関数をデコる
実はPythonは@(関数名)
という記述を関数定義の前につけることで入れ子状の構造に出来ます。
なので少しいじってみると
def deco(func):
def aaa():
print "wei soiya"
func()
return aaa
@deco
def hoge():
print "aaaaaaabb"
hoge()
wei soiya
aaaaaaabb
前に一文追加されます
上の例だと
@deco
def hoge
とすることで
hoge()
が
deco(hoge)()
と等価になってます。
多重デコレータ+引数をもたせる
多重のデコレータを組ませることも、ラッパーを噛ますことでデコレータに引数を別途渡すことも出来るようです。
def deco1(name):
def wrapper(func):
def aaaa():
print "your name is "+name
print "deco1 called!"
return func("aaa","www",yakiniku="teishoku")
return aaaa
return wrapper
def deco2(func):
def bbbb(*args, **kwargs):
print "wrap2 called!"
return func(*args, **kwargs)
return bbbb
@deco1('nanntara-kanntara-')
@deco2
def eee(*args, **kwargs):
print args
print kwargs
return "done"
print eee()
your name is nanntara-kanntara-
deco1 called!
wrap2 called!
('aaa', 'www')
{'yakiniku': 'teishoku'}
done
以下のサイトを参考にしました。