一个带有参数的装饰器的例子:
def decrator(*dargs, **dkargs):
def wrapper(func):
def _wrapper(*args, **kargs):
print "decrator param:", dargs, dkargs
print "function param:", args, kargs
return func(*args, **kargs)
return _wrapper
return wrapper
@decrator(1, a=2)
def foo(x, y=0):
print "foo", x, y
foo(3, y=4)
# 输出:
# decrator param: (1,) {'a': 2}
# function param: (3,) {'y': 4}
# foo 3 4
bottle.py中自动转换参数类型的装饰器:
def validate(**vkargs):
def decorator(func):
def wrapper(**kargs):
for key in vkargs:
# 根据vkargs中的参数的类型对kargs的参数进行类型转换
kargs[key] = vkargs[key](kargs[key])
return func(**kargs)
return wrapper
return decorator
@validate(id=int, x=float, y=float)
def move(id, x, y):
print "move %d (%0.2f, %0.2f)"%(id, x, y)
move(id="1", x="0.2", y="0.3")