Inheriting dictionary

Pavel Panchekha pavpanchekha at gmail.com
Tue Aug 18 22:32:58 CEST 2009


On Aug 18, 4:23 pm, "Jan Kaliszewski" <z... at chopin.edu.pl> wrote:
> 18-08-2009 o 21:44:55 Pavel Panchekha <pavpanche... at gmail.com> wrote:
>
>
>
> > I want a dictionary that will transparently "inherit" from a parent
> > dictionary. So, for example:
>
> > """
> > a = InheritDict({1: "one", 2: "two", 4: "four"})
> > b = InheritDict({3: "three", 4: "foobar"}, inherit_from=a)
>
> > a[1] # "one"
> > a[4] # "four"
> > b[1] # "one"
> > b[3] # "three"
> > b[4] # "foobar"
> > """
>
> > I've written something like this in Python already, but I'm wondering
> > if something like this already exists, preferably written in C, for
> > speed.
>
> AFAIN -- no. But you can easily implement it in Python with rather
> small loss of speed...
>
>   class InheritDict(dict):
>
>       class NoParent(object):
>           def __getitem__(self, key):
>               raise KeyError('There is no %r key in the hierarchy' % key)
>           def __nonzero__(self):
>               return False
>
>       noparent = NoParent()
>
>       def __init__(self, *args, **kwargs):
>           parent = kwargs.pop('inherit_from', self.noparent)
>           dict.__init__(self, *args, **kwargs)
>           self.parent = parent
>
>       def __getitem__(self, key):
>           try:
>               return dict.__getitem__(self, key)
>           except KeyError:
>               return self.parent[key]
>
> Did you do it in similar way? (just curiosity) :-)
>
> Regards,
> *j
>
> --
> Jan Kaliszewski (zuo) <z... at chopin.edu.pl>

I implemented it in a similar way (instead of a try block, an if
block, which works a tiny bit faster; also have a multiple-parents
case, but its rare, and I could do that in Python without much loss of
speed). Pity that there's no C version; this InheritDict is kind of
the core of my application (in a very basic test, I have 329901 calls
to __getitem__).

Oh well; I'll see if I can optimize the __getattr__ function with
minor tweaking. Thanks for your help.



More information about the Python-list mailing list