Iterate through a list calling functions
David Pratt
fairwinds at eastlink.ca
Sun Jun 5 13:57:56 EDT 2005
Hi Kent. Thank you for your reply. I gave this a go but get the
following traceback:
...
result = validator(name, value)
TypeError: 'str' object is not callable
Have put validators in list and iterate over it as in following:
validator_list =
[isContainedIn,isDate,isDecimal,isEmail,isEmpty,isInteger...
more validators....]
results={}
for validator in validators_list:
result = validator(name, value)
if type (result) in StringTypes:
# do some stuff...
return results
Regards,
David
On Sunday, June 5, 2005, at 02:03 PM, Kent Johnson wrote:
> David Pratt wrote:
>> Hi. I am creating methods for form validation. Each validator has its
>> own method and there quite a number of these. For each field, I want
>> to
>> evaluate errors using one or more validators so I want to execute the
>> appropriate validator methods from those available. I am iterating
>> over
>> each validator using validateField method to gather my results. It
>> works
>> but it ugly and inefficient. Can someone advise whether there is a
>> better way of doing this. I realize that the validator variable in my
>> iteration is only a string so question is how can I make the validator
>> string reference a function so I may be able to shorten validateField
>> to
>> something similar to this (instead of my long list of ifs which I am
>> not
>> very happy with):
>>
>> for validator in validators_list:
>> result = validator(name, value)
>> if type (result) in StringTypes:
>> results[name] = result
>
> Actually you can do exactly that by putting references to the
> validator functions in your list instead of (string) name. For example
> if you have
> validators = [ 'isDecimal', 'isFoo', 'isBar' ]
>
> just change it to
> validators = [ isDecimal, isFoo, isBar ]
>
> and your loop above will work.
>
> Python makes data-driven programming easy :-)
> Kent
>
>>
>> Many thanks
>> David
>>
>> My current situation below:
>>
>> # A large list of validators
>> def isDecimal(name, value):
>> """ Test whether numeric value is a decimal """
>> result = validateRegex(name,
>> value,
>> r'^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$',
>> errmsg='is not a decimal number.',
>> ignore=None)
>> return result
>>
>> def isZipCode(name, value):
>> """ Tests if field value is a US Zip Code """
>> result = validateRegex(name,
>> value,
>> r'^(\d{5}|\d{9})$',
>> errmsg='is not a valid zip code.',
>> ignore=None)
>> return result
>>
>> ... more validators
>>
>> # Iterating over validators to gather field errors
>> def validateField(name, value, validators_list, range=None,
>> valid_values=None):
>> """ Validates field input """
>> results={}
>> for validator in validators_list:
>> if validator == 'isContainedIn':
>> result = isContainedIn(name, value)
>> if type (result) in StringTypes:
>> more...
>> if validator == 'isDate':
>> result = isDate(name, value)
>> if type (result) in StringTypes:
>> more...
>> if validator == 'isDecimal':
>> result = isDecimal(name, value)
>> if type (result) in StringTypes:
>> more...
>>
>> more validators ...
>>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
More information about the Python-list
mailing list