On Aug 18, 4:23 pm, "Jan Kaliszewski" <z...@chopin.edu.pl> wrote: > 18-08-2009 o 21:44:55 Pavel Panchekha <pavpanche...@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...@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. -- http://mail.python.org/mailman/listinfo/python-list