Could you do something like this? class attrdict(dict): def __getattr__(self, attr): if self.has_key(attr): return self[attr] else: message = "'attrdict' object has no attribute '%s'" % attr raise AttributeError, message
If you have a dict item with the same name as a method in the class, you won't be able to get to it using syntax sugar, though. It doesn't seem that the syntax sugar saves you much typing anyway (a.foo vs. a['foo']), but perhaps it seems nicer in some aesthetic sense. - Andrew Coffman Alex Martelli wrote: > MonkeeSage <[EMAIL PROTECTED]> wrote: > > >>On Mar 2, 9:25 pm, [EMAIL PROTECTED] (Alex Martelli) wrote: >> >>>The problem is mostly that, given an instance a of attrdict, whether you >>>can call (e.g.) a.update(foo) depends on whether you ever set >>>a['update'], making the whole program extremely fragile -- a very high >>>price to pay for some modest amount of syntax sugar. >> >>How about something like... >> >>class attrdict(dict): >> def __init__(self, *args, **kwargs): >> dict.__init__(self, *args, **kwargs) >> for k, v in self.items(): >> dict.__setattr__(self, str(k), v) >> def __setitem__(self, k, v): >> dict.__setitem__(self, k, v) >> dict.__setattr__(self, str(k), v) >> __setattr__ = __setitem__ > > > Same problem: after x=attrdict(), x.update(foo) will work for a while, > then suddenly stop working after some innocuous loop such as: > for bah in yech: x[bah] = 23 > when one of the items in yech just happens to be the word 'update' > (similar issues with words such as 'get', 'pop', 'clear', etc, etc). > > Miscegenation between attributes and items *inevitably* sucks. > > > Alex -- http://mail.python.org/mailman/listinfo/python-list