kkumer wrote: > > I have to merge two dictionaries into one, and in > a "shallow" way: changing items should be possible > by operating either on two parents or on a > new dictionary. I am open to suggestions how > to do this (values are always numbers, BTW), but > I tried to do it by creating a dict-like class that just > forwards all calls to the two parent dicts, see below. > > It works, but one important thing is missing. I > am not able to expand new dictionary with > double-star operator ** to use it as a > set of keyword arguments of a function. > I googled a bit, but was unable to find what > property must an object have to be correctly > treated by **.
The following experiment shows that you only need to implement a keys() and __getitem__() method. $ cat kw.py class A(object): def keys(self): return list("ab") def __getitem__(self, key): return 42 def f(**kw): print(kw) f(**A()) $ python kw.py {'a': 42, 'b': 42} However, if you have A inherit from dict... $ cat kwd.py class A(dict): def keys(self): return list("ab") def __getitem__(self, key): return 42 def f(**kw): print(kw) f(**A()) $ python kwd.py {} it stops working -- probably a side-effect of some optimization. So if you change your hubDict's base class from dict to object you should get the desired behaviour. Peter -- http://mail.python.org/mailman/listinfo/python-list