updating a nested dictionary and using shelve.py

Morten werge at hotmail.com
Mon May 26 11:38:24 EDT 2003


Hi,

I've spent quite a lot of time on figuring out how to make a 
nested dictionary/database with shelve.py. Finally I found this method
on the
internet:

def rUpdate(targetDict, itemDict):
        valtab=[]
        #print type(targetDict)
        for key, val in itemDict.items():
            if type(val) == type({}):
                newTarget = targetDict.setdefault(key,{})
                self.rUpdate(newTarget, val)
            else:
                targetDict[key]=val

This worked fine using it directly on a dictionary, but it did not
work if I implemented it in a class, like this;

    # the result of this method is something like; 
    # ( {'key1':[val1,val2,..mvaln],'key2':{}} )
    #  - key1 is not nested
    #  - I try to nest key2, but that doesn't work...
    def rUpdate(self, targetDict, itemDict):
        # denne metoden oppdaterer targetDict ved å sette en ny key
eller
        # legge til verdier i en tabell for en gitt key.
        valtab=[]
        #print type(targetDict)
        for key, val in itemDict.items():
            if type(val) == type({}):
                # setdefault returnerer verdien til key eller setter
                # key (til {}) hvis den ikke finnes i targetDict.
                newTarget = targetDict.setdefault(key,{})
                self.rUpdate(newTarget, val)
            else:
                targetDict[key]=val
                #if not targetDict.has_key(key):
                #    targetDict[key]=[val]
                #else:
                #    orig=targetDict[key]
                #    for el in orig:
                #        valtab.append(el)
                #    if not val in valtab:
                #        valtab.append(val)
                #    #del targetDict[key]
                #    targetDict[key] = valtab
        return targetDict

There was also a problem with setdefault, but that worked fine when I
added a class DictMixin to UserDict.py, made shelve.py a subclass of
UserDict.DictMixin and added from __future__ import generators to
UserDict.py.

Anyway, my problem now is that rUpdate doesn't add values to the
nested keys (like key2), but sets an empty dictionary.

Here is the rest of my program:

class PhemuDataBase:

    def __init__(self,file='/mn/diphda/u1/mortewh/hovedfag/phemu/phemu.db'):
        self.db = shelve.open(file)
        #Shelf.__init__(self,self.db)

    def regEvent(self,day,month,year,m1,OccOrEcl,m2,PAT,obssite,telesc,ccdObs,comment,midtime,intdrop,file):

        date=day+'.'+month+'.'+year
        if PAT.lower()=='p': type='Partial'; tt='P'
        if PAT.lower()=='a': type='Annular'; tt='A'
        if PAT.lower()=='t': type='Total';   tt='T'
        if OccOrEcl.lower()=='ecl' or OccOrEcl.lower()=='e': shade='e'
        if OccOrEcl.lower()=='occ' or OccOrEcl.lower()=='o': shade='o'
        if m1.lower()=='j1': mo1='1'
        elif m1.lower()=='j2': mo1='2'
        elif m1.lower()=='j3': mo1='3'
        elif m1.lower()=='j4': mo1='4'
        if m2.lower()=='j1': mo2='1'
        elif m2.lower()=='j2': mo2='2'
        elif m2.lower()=='j3': mo2='3'
        elif m2.lower()=='j4': mo2='4'
        event=m1+' '+OccOrEcl+' '+m2+' - '+type
        
        # registers the date - this works fine...
        self.db=self.rUpdate(self.db,{'dates':date})   # date til
'dates'-key
        
        # the rest doesn't work
        # nested keys [date]['Events'], [date]['Sites']
        self.db=self.rUpdate(self.db,{date:{'Events':mo1+shade+mo2+tt}})
        self.db=self.rUpdate(self.db,{date:{'Sites':obssite}})

        # Setter observasjoner som er gjort på aktuell dato,
        # event og sted.
        self.db=self.rUpdate(self.db,{date:{event:{obssite:{'Telescopes':telesc}}}})
        
        # Setter informasjon om lyskurven fra observasjoner med
        # teleskop 'telesc', på sted 'obssite' av event 'event'
        # på dato 'date'.
        self.db=self.rUpdate(self.db,{date:{event:{obssite:{telesc:{'Midtime':midtime}}}}})
        self.db=self.rUpdate(self.db,{date:{event:{obssite:{telesc:{'Intensity
drop':intdrop}}}}})
        self.db=self.rUpdate(self.db,{date:{event:{obssite:{telesc:{'Comment':comment}}}}})
        self.db=self.rUpdate(self.db,{date:{event:{obssite:{telesc:{'File':file}}}}})




More information about the Python-list mailing list