On 6/7/2010 6:03 PM, Peter Otten wrote:
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.

In 2.6, the requirement changed from '(subclass of) dictionary' to 'mapping' so this is a bit strange. It sort of looks like a bug. I will test with 3.1 tomorrow (later today, actually).

tjr



--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to