executing list of methods (and collecting results)
gherzig at fmed.uba.ar
gherzig at fmed.uba.ar
Thu Sep 20 21:43:13 EDT 2007
> Gerardo Herzig wrote:
>
>> I want the collect_validators() method is to execute any of the
>> above methods, and collect their names as items of a list (wich
>> will be the collect_validators() return value).
>
> (inside class definition -- untested)
> validators = {"is a number": is_really_a_number,
> "is even": is_even,
> "is greater than zero": is_greater_than_zero}
>
> def collect_validators(self):
> return [desc for desc, func in self.validators.items() if func()]
>
Excelent!!!
>> My first approach is:
>
> ... no method, but a generator. Executing it will give you a
> generator object instead of a result list.
>
>> [code]
>> def collect_validators(self):
>> v_dict = { 'is_really_a_number': is_really_a_number,
>> 'is_even': is_even,
>> 'is_greater_than_zero', is_greater_than_zero
>> }
>>
>> for name, meth in v_dict.items():
>> result = meth()
>> if result: yield name
>> [/code]
>>
>> I wondering if is this a good pattern to apply, i like the way it
>> looks like, at least to me it looks `natural',
>
> IMHO, it doesn't look natural. It depends on what you want to
> achieve. This generator will need to be iterated over until it
> is "exhausted".
Im having some fun doing a mail filter. A master thread will fire several
threads (each one returning a list with the matched validators) and
collect the results of each one of them.
>
>> but...im calling every method twice here?
>
> No. Methods are only called if you apply the function call
> operator, "()".
>
> BTW, I hope you don't really want to test a number to be greater
> than zero, or even, by using an own method, respectively, just to
> test this.
Haha, no, the actual methods do other kind of things.
Thanks Björn!!!
Cheers.
Gerardo
More information about the Python-list
mailing list