デコレータを理解する為のサンプル

単純にデコレータを理解する為のサンプルで、
AOPを書く方法という観点のサンプル

メソッドをラップするという点を忘れない為のサンプル

def query(param1, param2=None):
    res = [1, 2, 3]
    def _wrap1(function):
        def _wrap2(*args, **kwargs):
            print('前処理:decorate parameter {} {}'.format(param1, param2))
            print('前処理:args   = {}'.format(args))
            print('前処理:kwargs = {}'.format(kwargs))
            i = function(*args, **kwargs)
            print('後処理:{}'.format(i))
            res.append(i)
            return res
        return _wrap2
    return _wrap1

@query(param1='a', param2='b')
def foo(x, y=None):
    print('foo')
    print(x)
    print(y)
    return 4

r = foo(12)
print('r = %s' % r)

結果

前処理:decorate parameter a b
前処理:args   = (12,)
前処理:kwargs = {}
foo
12
None
後処理:4
r = [1, 2, 3, 4]