On Sun, 24 Jul 2005 12:07:02 +0300, Thanos Tsouanas wrote: > On Sat, Jul 23, 2005 at 06:59:43PM -0600, Steven Bethard wrote: >> Thanos Tsouanas wrote: >> > I would like to have a quick way to create dicts from object, so that a >> > call to foo['bar'] would return obj.bar. >> > >> > The following works, but I would prefer to use a built-in way if one >> > exists. Is there one? >> >> Maybe I'm not understanding your problem, but have you looked at the >> builtin "vars()"? > > I didn't know about it, but I knew about object.__dict__ which is, as I > see equivalent with vars(object). But it doesn't do the job for me, > since it fails to grab all obj.foo's, some of them being properties, > etc.
You could have mentioned this earlier. But I don't think you are correct. As far as I can see, properties do have an entry in obj.__dict__ the same as other attributes, although there is certainly some strangeness going on with properties. Using the sample code from here: http://www.python.org/2.2.3/descrintro.html#property class C(object): def __init__(self): self.__x = 0 def getx(self): return self.__x def setx(self, x): if x < 0: x = 0 self.__x = x x = property(getx, setx) I see _C__x in C().__dict__, exactly as expected. (The _C is Python's standard name mangling of "semi-private" attributes starting with double underscores.) I can't see any way to inspect a Python object and get a list of properties, so you might have to keep your own list: add a class-attribute of your object which keeps a list of all the properties: class Obj: # various methods, attributes and properties ... # keep a list of special properties that don't show # up correctly in __dict__ special = ['foo', 'bar'] # now define a special method that makes a copy of # __dict__ and adds special properties to it def objdict(self): D = self.__dict__.copy() # assume shallow copy is enough for property_name in self.special: D[property_name] = self.__getattribute__(property_name) return D then call it when you need it: print "My object has fields %(foo)s and %(bar)s." % obj.objdict() It would be nice to see an easier way to introspect objects and get a list of properties. -- Steven. -- http://mail.python.org/mailman/listinfo/python-list