デコレータは、関数を返す関数です。「デコレーターにパラメーターを渡す」場合、実際に行っているのは、デコレーターを返す関数を呼び出すことです。したがってdecAny()
、関数を返す関数を返す関数であるべきです。
次のようになります。
import functools
def decAny(tag):
def dec(f0):
@functools.wraps(f0)
def wrapper(*args, **kwargs):
return "<%s> %s </%s>" % (tag, f0(*args, **kwargs), tag)
return wrapper
return dec
@decAny( 'xxx' )
def test2():
return 'test1XML'
例:
>>> print(test2())
<xxx> test1XML </xxx>
*args
発生していた特定の問題を修正することに加えて、ラップされた関数にとを引数として追加し、それらをデコレータ内の呼び出しに**kwargs
渡すことで、コードを少し改善したことに注意してください。f0
これにより、任意の数の位置引数または名前付き引数を受け入れる関数をデコレートでき、引き続き正しく機能します。
ここについて読むことができますfunctools.wraps()
:
http://docs.python.org/2/library/functools.html#functools.wraps