DrConti a écrit : > Dear Python developer community, > I'm quite new to Python, so perhaps my question is well known and the > answer too. > > I need a variable alias ( what in other languages you would call "a > pointer" (c) or "a reference" (perl))
Well, that's the only kind of "variable"[1] in Python. [1] the correct name in Python is 'binding', since it's about 'binding' a reference to a name, not labelling an in-memory address and storing data there. > I read some older mail articles and I found that the offcial position > about that was that variable referencing wasn't implemented because > it's considered bad style. > There was also a suggestion to write a real problem where referencing > is really needed. > I have one...: You *think* you have one. > I'm trying to generate dynamically class methods which works on > predefined sets of object attributes. > one of these is the set of attributes identfying uniquely the object > (primary key). > A naïve attempt to do the job: > > class ObjectClass: > """ Test primary Key assignment """ > > if __name__ == "__main__": > > ObjectClassInstantiated=ObjectClass() > ObjectClassInstantiated.AnAttribute='First PK Elem' > ObjectClassInstantiated.AnotherOne='Second PK Elem' > ObjectClassInstantiated.Identifier=[] > > ObjectClassInstantiated.Identifier.append(ObjectClassInstantiated.AnAttribute) > > ObjectClassInstantiated.Identifier.append(ObjectClassInstantiated.AnotherOne) > print ObjectClassInstantiated.Identifier > ObjectClassInstantiated.AnAttribute='First PK Elem Changed' > print ObjectClassInstantiated.Identifier > > leads a wrong result > >>./test.py > > ['First PK Elem', 'Second PK Elem'] > ['First PK Elem', 'Second PK Elem'] > --> wrong! It should write ['First PK Elem Changed', 'Second PK Elem'] Nope, it's exactly what you asked for !-) > > i.e. the assgnment > > ObjectClassInstantiated.Identifier.append(ObjectClassInstantiated.AnAttribute) > > assigns only the attribute value, not the reference. 1/ it's not an assignement 2/ it does not store the attribute "value", it stores the reference to the object the attribute is bound to. When you later rebind the attribute, it only impact this binding - there's no reason it should impact other bindings. > so my question is: > is it still true that there is no possibilty to get directly object > references? But object references *are* what you have. > Is there a solution for the problem above ? Yes : keep a reference to the attribute name, not to the value bound to that name. There are many ways to do it, here's one: ObjectClass.Identifier = property( fget=lambda self: [self.AnAttribute, self.AnotherOne] ) and here's another one: ObjectClassInstantiated._identifier_parts = [] # note the use of strings, not symbols ObjectClassInstantiated._identifier_parts.append("AnAttribute") ObjectClassInstantiated._identifier_parts.append("AnotherOne") ObjectClass.Identifier = property( fget=lambda self: [getattr(self, name) \ for name in self._identifier_parts] ) > Thank you for any feedback May I add some ? Your naming conventions are highly unpythonic. We usually use CamelCase for classes names, and (in order of preference) all_lower_with_underscores or mixedCaps for variables/attributes/functions etc. HTH -- http://mail.python.org/mailman/listinfo/python-list