Kent Johnson wrote: > Remco Gerlich wrote: >> I can't think of a really good generalization, one that will work for >> all depths. That's the sort of thing you use Lisp, combinators and lots >> of coffee for. Perhaps later today. > > Some nice solutions here: > http://groups.google.com/group/comp.lang.python/browse_thread/thread/9519c885a24a65ea/c9697fa73bb59709 > > Kent
These solutions sometimes may have unexpected behavior. class recursivedefaultdict(object): def __init__(self): self.__dd = defaultdict(recursivedefaultdict) def __getattr__(self,attr): return self.__dd.__getattribute__(attr) def __getitem__(self,*args): return self.__dd.__getitem__(*args) def __setitem__(self,*args): return self.__dd.__setitem__(*args) d = recursivedefaultdict() d['pepe']['jose']['juan'] = 25 d['pepe']['jose'] = 25 d['pepe']['martin'] = 33 [i for i in d['pepe']] And it went into an infinite loop. class recursivedefaultdict(defaultdict): def __init__(self): self.default_factory = type(self) d = recursivedefaultdict() d['pepe']['jose']['juan'] = 25 d['pepe']['jose'] = 25 d['pepe']['martin'] = 33 d it prints : defaultdict(<class '__main__.hash'>, {'pepe': defaultdict(<class '__main__.hash'>, {'jose': defaultdict(<class '__main__.hash'>, {'juan': 25}), 'pedro': 25, 'martin': 33})}) [i for i in d['pepe']] it prints : ['jose', 'pedro', 'martin'] expected : [defaultdict(<class '__main__.hash'>, {'jose': defaultdict(<class '__main__.hash'>, {'juan': 25}), 'pedro': 25, 'martin': 33})] [i for i in d] it prints : ['pepe'] expected : [defaultdict(<class '__main__.hash'>, {'pepe': defaultdict(<class '__main__.hash'>, {'jose': defaultdict(<class '__main__.hash'>, {'juan': 25})})})] Anyway it otherwise seems to behave properly : a = d['pepe'] a it prints : defaultdict(<class '__main__.hash'>, {'jose': defaultdict(<class '__main__.hash'>, {'juan': 25}), 'pedro': 25, 'martin': 33}) as would be expected. And class hash behaves like this last one. class hash(defaultdict): def __init__(self): defaultdict.__init__(self, hash) _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor