Inheriting dictionary

Jan Kaliszewski zuo at chopin.edu.pl
Tue Aug 18 22:23:09 CEST 2009


18-08-2009 o 21:44:55 Pavel Panchekha <pavpanchekha 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) <zuo at chopin.edu.pl>



More information about the Python-list mailing list