Thanos Tsouanas wrote: > On Sun, Jul 24, 2005 at 02:14:15PM -0600, Steven Bethard wrote: > >>How about something like: >> dict((name, getattr(obj, name)) for name in dir(obj)) > > Pretty!!! > >>Looks like this will get instance attributes, class attributes and >>properties just fine. > > But not SQLObject's objects... > Any idea why? (Getting attribute errors, it seems that these > "attributoids" are not listed in dir(obj), so i have to use my ugly > dictobj class.. :(
I don't know how SQLObjects are implemented, but I'm guessing they use __getattr__ or __getattribute__: py> class C(object): ... w = 1 ... @property ... def x(self): ... return 2 ... def __init__(self): ... self.y = 3 ... def __getattr__(self, name): ... if name == 'z': ... return 4 ... py> c = C() py> d = dict((name, getattr(c, name)) for name in dir(c)) py> d['w'], d['x'], d['y'] (1, 2, 3) py> d['z'] Traceback (most recent call last): File "<interactive input>", line 1, in ? KeyError: 'z' Any attribute simulated through __getattr__ or __getattribute__ cannot be found by dir(): py> dir(c) ['__class__', '__delattr__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'w', 'x', 'y'] For this reason, I try to avoid implementing attributes through these methods, but sometimes it's unavoidable. STeVe -- http://mail.python.org/mailman/listinfo/python-list