用Python Decorator简化代码
发表于2011年10月14日看码不说话。
def deco(callable): def method(a, b): print "a: %s" % a print "b: %s" % b return callable(a, b) return method @deco def test1(a,b): print a+b test1(10,20)
上面的Decorator只能装饰有两个参数的函数,否则
@deco def test2(a,b,c): print a+b+c
会报错
>>> test2(10,20,30) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: method() takes exactly 2 arguments (3 given)
如需支持装饰任意参数的函数,得使用以下方法:
def deco(callable): def method(*args, **kws): print "args: %s" % repr(args) print "kws: %s" % repr(kws) return callable(*args, **kws) return method @deco def test1(a,b): print a+b @deco def test2(a,b,c): print a+b+c test1(10,20) test1(10,b=20) test2(10,20,30) test2(10,b=20,c=30)
结果是:
>>> test1(10,20) args: (10, 20) args: {} 30 >>> test1(10,b=20) args: (10,) args: {'b': 20} 30 >>> test2(10,20,30) args: (10, 20, 30) args: {} 60 >>> test2(10,b=20,c=30) args: (10,) args: {'c': 30, 'b': 20} 60