> 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 -- http://mail.python.org/mailman/listinfo/python-list