namespaces module (a.k.a. bunch, struct, generic object, etc.) PEP
Steven Bethard
steven.bethard at gmail.com
Sat Feb 12 00:51:13 EST 2005
Nick Coghlan wrote:
> There *is* a problem with using __getattr__ though - any attribute in
> the chained namespaces that is shadowed by a class attribute (like
> 'update') will be picked up from the class, not from the chained
> namespaces. So we do need to use __getattribute__ to change that lookup
> order. However, given the amount of grief the default lookup behaviour
> causes, I think the place to do that is in Namespace itself:
>
> class Namespace(object):
> # otherwise unchanged
> def __getattribute__(self, name):
> """Namespaces do NOT default to looking in their class dict
> for non-magic attributes
> """
> getattribute = super(Namespace, self).__getattribute__
> try:
> return getattribute("__dict__")[name]
> except KeyError:
> if name.startswith('__') and name.endswith('__'):
> # Employ the default lookup system for magic names
> return getattribute(name)
> else:
> # Skip the default lookup system for normal names
> if hasattr(self, "__getattr__"):
> return getattribute("__getattr__")(name)
> else:
> raise AttributeError(name)
Hmmm... This does seem sensible. And sidesteps the issue about
suggesting that subclasses use Namespace.update instead of
namespaceinstance.update -- the latter just won't work! (This is a Good
Thing, IMHO.)
> Anyway, it is probably worth digging into the descriptor machinery a bit
> further in order to design a lookup scheme that is most appropriate for
> namespaces, but the above example has convinced me that
> object.__getattribute__ is NOT it :)
Yeah, I'm going to look into this a bit more too, but let me know if you
have any more insights in this area.
Steve
More information about the Python-list
mailing list