我有一张地图,表示将字符串映射到类似的函数:
validator = {'first_name' : validate_str,
'last_name' : validate_str,
'phone' : validate_phone }
我需要根据地图中的值类型调用相应的验证函数,该值将作为输入提供给我。
for name in elements:
# Validate the value of this name in the input map using the function
# input is the map that has the value for each of these fields
# elements is a list of all fields used to loop through one input at a time
if validator[name]( input[name] ) is False:
# Throw validation error
else:
# Do something else
除非在这种情况下我不确定是否可以这样做,否则这样可以正常工作:
validate_str还会检查给定字符串是否具有所需的最大长度。
def validate_str(str, max-len):
# Throw error if len(str) > max-len
max-len可以根据字符串而有所不同,所以我需要为first_name调用validate_str,例如64个字符,姓氏为256个字符。
我可以使用不同的地图来说明这个字段有这个max_len,但是验证器映射是否可以指向validate_str函数,并且根据字段预设了max-len参数?
类似的东西:
validator = {'first_name' : validate_str(max-len=64),
'last_name' : validate_str(max-len=256),
'phone' : validate_phone }
然后调用它进行验证,如:
if validator[name]( str=input[name] ) is False:
# The appropriate value for max-len goes with the function call and just the
# str is appended to the argument list while invoking.
这样可以让生活更轻松,这样我们就不必再记住哪些字段会随之发送max-len。
答案 0 :(得分:3)
您可以使用lambda创建一个参数的函数(正在验证的字符串),但其长度定义在:
{'first-name':lambda x: validate-str( x, 64 ), ...
答案 1 :(得分:0)
有两种方法可以做到这一点。
你特别要求的答案是如何咖喱(Scott Hunter回答)。
另一种方法是使用函数工厂(“高阶函数”)返回一个函数,该函数捕获闭包中的自定义参数,例如:
def makeStringValidator(maxLength=64):
def validator(string):
return len(string)<maxLength
return validator
但是,一般情况下,限制自己使用此系统会阻止您在字段之间进行“交叉”验证。例如,如果您将字段birthday_day, birthday_month, birthday_year
作为单独的字段,则可以单独验证每天是30或31,但不知道月份以确定哪个(也是2月的闰日)。