[Python-de] kann lokale Variable keinen neuen Wert zuweisen

Steffen Oschatz steffen.oschatz at philips.com
Die Sep 6 15:35:08 CEST 2005


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hallo Zusammen,

folgendes Problem gilt es zu meistern:

Man nehme eine rekursive Methode ( Erklärung s.u.):

    def rebuildTree(self, xmltree, gdkroot, append=False):
        if gdkroot:
            print "gdkroot1: ", self.treestore.get(gdkroot, 0), 
self.treestore.get_path(gdkroot)
 
        if gdkroot == None: 
            setting, append = False, True
            command = self.treestore.append 
            gdkroot = command(None, self.buildRow(self.xmlTree.getroot(), 
setting))
        elif append == True:
            command = self.treestore.append
            setting = False
        else : 
            command = self.setAttributs
            setting, append = True, False
            if self.treestore.get_string_from_iter(gdkroot) == '0':
                gdkroot = self.getNextTreeIter(gdkroot)
                print "gdkroot2: ", self.treestore.get(gdkroot, 0), 
self.treestore.get_path(gdkroot)
 
        if  type (xmltree) == list:
            for tag in xmltree:
                subroot = command(gdkroot, self.buildRow(tag, setting))
                print "Return1\t:", self.treestore.get(subroot, 0), 
self.treestore.get_path(subroot)
                childs = tag.getchildren()
                for child in childs:
                    if child.getchildren():
                        print "Param1\t:", self.treestore.get(subroot, 0), 
self.treestore.get_path(subroot)
                        self.rebuildTree([child], subroot.copy(), append)
                    else:
                        if setting == False: 
                            print "Param2\t:", self.treestore.get(subroot, 
0), self.treestore.get_path(subroot)
                            command(subroot, self.buildRow(child, 
setting)) 
                        else: 
                            subroot = command(subroot, 
self.buildRow(child, setting)) 
                            print "Return2\t:", 
self.treestore.get(subroot, 0), self.treestore.get_path(subroot) 
        else:
            raise TypeError 

Und bekommt folgende, für mich völlig unlogische Ausgabe:

gdkroot1:  ('EA',) (0,)
Child   : IN:  ('EA',) (0,) OUT :  ('Entwicklung',) (0, 0)
gdkroot2:  ('Entwicklung',) (0, 0)
Child   : IN:  ('Entwicklung',) (0, 0) OUT :  ('DH',) (0, 0, 0)
Return1 : ('DH',) (0, 0, 0)
Param1  : ('DH',) (0, 0, 0)
gdkroot1:  ('DH',) (0, 0, 0)
Child   : IN:  ('DH',) (0, 0, 0) OUT :  ('KMV6.1',) (0, 0, 0, 0)
Return1 : ('KMV6.1',) (0, 0, 0, 0)
Next    : IN:  ('KMV6.1',) (0, 0, 0, 0) OUT :  ('KMV6.2',) (0, 0, 0, 1)
Return2 : ('KMV6.2',) (0, 0, 0, 1)
Next    : IN:  ('KMV6.2',) (0, 0, 0, 1) OUT :  ('KMR6.1',) (0, 0, 0, 2)
Return2 : ('KMR6.1',) (0, 0, 0, 2)
Next    : IN:  ('KMR6.1',) (0, 0, 0, 2) OUT :  ('KMR6.2',) (0, 0, 0, 3)
Return2 : ('KMR6.2',) (0, 0, 0, 3)
Parent  : IN:  ('KMR6.2',) (0, 0, 0, 3) OUT :  ('ICFH',) (0, 0, 1)
Return2 : ('ICFH',) (0, 0, 1)
Param1  : ('DH',) (0, 0, 0)
gdkroot1:  ('DH',) (0, 0, 0)

So, und was ist daran nun unlogisch ? Folgendes : 
Wie man sieht befindet sich das letzte "Return2" am Ende der innersten 
Schleife mit dem korrekten zugewiesenen Wert für subroot  mit Inhalt 
"('ICFH',) (0, 0, 1)" (Gtk.TreeIter).
Der nächste Schleifendurchlauf startet, und nun ist auf der selben 
Variable auf einmal wieder der Wert  der zuvorigen Rekursion 
(gekennzeichnet durch "gdkroot1").
Allerdings kommt der Rekursionsaufruf erst in der nächsten Zeile.     (?)

Der Debugger verhält sich noch viel seltsamer an dieser Stelle: er springt 
vom Ende der innersten Schleife zu deren Kopf, dann weiter zu dem Kopf der 
nächsten äußeren Schleife, 
weiter zu dem raise TypeError (wird aber nicht ausgeführt) und schließlich 
zurück zur ersten Zeile der inneren Schleife. *puh* (???)

Also da weis ich nun echt nicht mehr weiter.

Wenn es hilft erkläre ich auch noch den Sinn der Methode: Sie baut ein GTK 
Tree nach der Struktur eines XML-Files auf. Dies funktioniert ganz 
hervorragend für den Fall, das der Baum noch nicht vorhanden ist und
demzufolge die append Funktion benutzt werden kann, welche den Iterator 
für das nächste Element liefert. Ist der Baum schon vorhanden darf dieser 
jedoch nur noch mit der set-Funktion geupdatet werden.
Dafür ist es notwendig den benötigten Iterator für den GDk-Tree selbst zu 
berechen (in self.setAttributs)  in deepFirst Analogie.

HILFE !!!

mfG
Steffen Oschatz

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32) - WinPT 0.9.93-cvs

iD8DBQFDHZsx20mFn2wezXcRAhAOAJ930iI2+JrvF163RIirYSuzypeQJwCeOC4c
InkSL1oish4148LYr1Yl+Yk=
=wpTK
-----END PGP SIGNATURE-----