Seite 1 von 1
Re: partial mit Methoden-Parameter
Verfasst: Donnerstag 2. August 2012, 17:43
von deets
Goswin hat geschrieben:
Geschätzter deets, du weißt gar nicht, wie beliebt du wärest, wenn du bei deiner Hilfestellung uns vergessliche Handbuchleser nicht gleich ausschimpfen würdest

!
Das unterstellt, das mir Beliebtheit wichtiger waere als Spass an provokanten Formulierungen zu haben! Und ich versuche meine schandmaeuligkeit mit dem Willen des Posters zu korrelieren, den Fehler erstmal bei sich statt bei Python oder dem Rest der Welt zu suchen

Re: partial mit Methoden-Parameter
Verfasst: Freitag 3. August 2012, 18:33
von Goswin
lunar hat geschrieben:@Goswin: Bist Du Dir sicher, dass Du wirklich dieses Verhalten wünschst?
Du hast recht, lambda lässt sich für callbacks nicht verwenden: bei Python nimmt das Argument der Funktion den Wert an, den es beim *Aufruf* des Callbacks hat, und nicht den Wert bei der *Definition* des Callbacks.

Und das ist *nicht*, was ich brauche.
Re: partial mit Methoden-Parameter
Verfasst: Freitag 3. August 2012, 18:45
von lunar
@Goswin: "i" ist kein Argument, sondern ein sogenannter „freier Name“. Python bindet freie Namen nicht über ihren Wert, sondern über ihren Namen. "i" innerhalb des "lambda"s ist also keine Kopie von "i", sondern eine Referenz darauf. "i" verhält sich zum "lambda" wie eine globale Variable zu einer normalen Funktion.
Re: partial mit Methoden-Parameter
Verfasst: Freitag 3. August 2012, 19:03
von Goswin
@lunar: Richtig.
Re: partial mit Methoden-Parameter
Verfasst: Samstag 4. August 2012, 13:38
von yipyip
@Goswin
Ob man 'lambda' oder 'partial' verwendet, haengt im allgemeinen nicht vom Problem ab, man muss die Sachen nur richtig anwenden.
Um das Ganze mal aufzudröseln, ein einfaches Beispiel mit lambda:
Code: Alles auswählen
import Tkinter as tk
class Gui(object):
def __init__(self):
self.root = tk.Tk()
self.buttons = [tk.Button(self.root, width=20, text='{0}'.format(i),
command=lambda j=i: self.do_command(j)) for i in xrange(9)]
for but in self.buttons:
but.pack()
for i, but in enumerate(self.buttons):
but.bind('<Button-1>', lambda event, j=i: self.do_binding(event, j))
def do_command(self, i):
print 'command {0}'.format(i)
def do_binding(self, event, i):
print 'binding {0} {1}'.format(i, event.widget)
def run(self):
self.root.mainloop()
if __name__ == '__main__':
Gui().run()
Und hier mit partial:
Code: Alles auswählen
import Tkinter as tk
from functools import partial
class Gui(object):
def __init__(self):
self.root = tk.Tk()
self.buttons = [tk.Button(self.root, width=20, text='{0}'.format(i),
command=partial(self.do_command, i)) for i in xrange(9)]
for but in self.buttons:
but.pack()
for i, but in enumerate(self.buttons):
but.bind('<Button-1>', partial(self.do_binding, i))
def do_command(self, i):
print 'command {0}'.format(i)
def do_binding(self, i, event):
print 'binding {0} {1}'.format(i, event.widget)
def run(self):
self.root.mainloop()
if __name__ == '__main__':
Gui().run()