使用参数发送带有参数的函数指针,然后在调用时添加其他参数

时间:2012-03-02 00:07:39

标签: python

我有一张地图,表示将字符串映射到类似的函数:

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。

2 个答案:

答案 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月的闰日)。

然而,我个人经常使用这个系统。如果出现这种需求,您可以在以后更复杂的情况下补充当前系统。