Marc Aymerich wrote: > Hi, > > I'm playing a bit with python dynamic methods and I came up with a > scenario that I don't understant. Considering the follow code: > > # Declare a dummy class > class A(object): > pass > > # generate a dynamic method and insert it to A class > for name in ['a', 'b', 'c']: > if name == 'b': > @property > def get_name(self): > return name > A.name = get_name > > > a_instance = A() > a_instance.name > > # So far I exptect that a_instance.name returns 'b', since it has > been created when name == 'b', but this is what actually returns: > >>>> a_instance.name > 'c' > > just the last 'name' value. > What can I do in order to generate a method like this but that returns > 'b' ? What is wrong in my understanding of this pice of code?
Look at the method again: > def get_name(self): > return name It returns the global variable name. Why would you expect to see a historical value of that variable? If you want to capture the value of name at the time when get_name() is defined you have several options: - The default argument trick: def get_name(self, name=name): return name - A closure: def make_get_name(name): def get_name(self): return name return get_name A.name = property(make_get_name(name)) - functools.partial() def get_name(self, name): return name A.name = property(partial(get_name, name=name)) -- http://mail.python.org/mailman/listinfo/python-list