我需要写很多的校验函数,这些校验函数都有 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 。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.