lokale Funktionsdefinitionen

17/08/2009 - 15:50 von Ole Streicher | Report spam
Hallo Gruppe,

neben den Holy Wars noch eine praktische Frage:

ich möchte gerne (für pyqt4) eine Handvoll Funktionen erzeugen, die
bestimmte Menüaktionen ausführen. Ich hatte mir das so gedacht
(Qt-Zeilen sind nur Illustration):

menu = QtGui.QMenu()
for line in self.lines:
action = QtGui.QAction(line.name, self)

def toggle():
self.do_toggle_line(line)

self.connect(action, QtCore.SIGNAL('triggered()'), toggle)
menu.addAction(action)

in Prosa: für jeder der im Objekt gespeicherten Linien definiere ich
eine Funktion toggle(), die ich danach an einen Menüpunkt binde.

Was aber passiert ist, dass alle nur die letzte toggle-Funktion
erhalten.

Warum ist das so und wie kann ich das àndern?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Juergen Wieferink
17/08/2009 - 16:42 | Warnen spam
Ole Streicher schrieb [gekürzt]:
for line in self.lines:
def toggle():
self.do_toggle_line(line)

self.connect(action, QtCore.SIGNAL('triggered()'), toggle)


[...]
Was aber passiert ist, dass alle nur die letzte toggle-Funktion
erhalten.



Wenn ich das richtig verstanden habe, wird der Name "line" erst
wàhrend des Ausführens der Funktion aufgelöst. Weil das natürlich
erst am Ende der Schleife ist, bleibt der letzte Wert von _line_
übrig. Das typischerweise vorgeschlagene Idiom in diesem
Zusammenhang ist:


for line in self.lines:
def toggle(line=line):
self.do_toggle_line(line)

self.connect(action, QtCore.SIGNAL('triggered()'), toggle)


Auf diese Weise wird das aktuelle Objekt namens "line" als
Defaultwert gespeichert und spàter verwendet. Insbesondere findet
kein unmittelbarer Zugriff mehr auf Variablen außerhalb der
Funktionsdefinition mehr statt, was Code für mich noch
unübersichtlicher macht als globale Variablen.

Juergen

Ähnliche fragen