On Feb 23, 2:05 pm, Peter Otten <__pete...@web.de> wrote: > 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?
hehe, yeah, after sending my email I realized that it was obvious, but the true is I came up with this problem in a more complex situation involving lot's of imports and so on.. so the question: wtf is going on?? came up to me at this time :P > 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)) Wow Peter, I was expecting one solution and you give me 3 amazing solutions!! :) Thanks a lot! btw I always wondered for what functools.partial can be useful, now I know an example :) -- http://mail.python.org/mailman/listinfo/python-list