Iterate through a list calling functions
Kent Johnson
kent37 at tds.net
Sun Jun 5 13:03:16 EDT 2005
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 ...
>
More information about the Python-list
mailing list