Nick Coghlan <[EMAIL PROTECTED]> wrote:
We could use __add__, instead for combining namespaces
Update already let's us combine namespaces. To create a new object that merges two namespaces do: namespace.update(namespace(ns_1), ns_2)
One thing I'd like to see in namespaces is _chaining_ -- keeping each namespace separate but having lookups proceed along the chain. (The best semantics for _bindings_ as opposed to lookups isn't clear though).
I'm not sure I understand exactly what you're looking for here... Is this what you want?
py> b = Bunch.chain(Bunch(x=1), Bunch(x=2, y=2), Bunch(y=3))
py> b.x
1
py> del b.x
py> b.x
2
py> del b.x
py> b.x
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "D:\Steve\My Programming\python\bunch.py", line 104, in __getattribute__
raise AttributeError(name)
AttributeError: x
py> b.y
2
py> del b.y
py> b.y
3
py> del b.y
py> b.y
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "D:\Steve\My Programming\python\bunch.py", line 104, in __getattribute__
raise AttributeError(name)
AttributeError: y
Or should 'del b.x' remove all 'x' attributes from all the bunches in the chain?
The code I used for this looks like:
class Bunch(object): ... class chain(object): def __init__(self, *bunches): self._bunches = bunches def __getattribute__(self, name): getattribute = super(Bunch.chain, self).__getattribute__ try: return getattribute(name) except AttributeError: for bunch in getattribute('_bunches'): try: return getattr(bunch, name) except AttributeError: pass raise AttributeError(name) def __delattr__(self, name): for bunch in self._bunches: try: return delattr(bunch, name) except AttributeError: pass raise AttributeError(name)
I didn't know what to do for __setattr__... Was that what you meant by "The best semantics for _bindings_ as opposed to lookups isn't clear though"?
Steve -- http://mail.python.org/mailman/listinfo/python-list