我需要写很多的校验函数,这些校验函数都有 default=None, optional=False, desc=None这几个参数。
def int_validater(min=0, max=1024,
default=None, optional=False, desc=None):
def validater(value):
if value is None:
if default is not None:
return default
elif optional:
return None
else:
raise Invalid("required")
try:
v = int(value)
except ValueError:
raise Invalid("invalid int")
if v < min:
raise Invalid("value must >= %d" % min)
elif v > max:
raise Invalid("value must <= %d" % max)
return v
return validater
def bool_validater(default=None, optional=False, desc=None):
def validater(value):
if value is None:
if default is not None:
return default
elif optional:
return None
else:
raise Invalid("required")
if isinstance(value, bool):
return value
else:
raise Invalid("invalid bool")
return validater
这些校验函数用法类似这样:
validater = int_validater(0,10,default=5)
validater(-1) # raise Invalid("value must >= %d" % min)
validater(20) # raise Invalid("value must <= %d" % max)
怎么简化代码,避免 copy? 我试了用装饰器,但是不能处理好参数顺序,装饰后的函数原型因该是下面这样:
wraped_validater(default=None, optional=False, desc=None,*args,**kwargs)
如果int_validater(0,10,default=5),这样 0 和 10 对应的是 optional 和 desc ,而不是*args 。