Verdtändnisproblem lambda

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
kitebuggy
User
Beiträge: 29
Registriert: Donnerstag 5. August 2021, 21:11

Hallo

Habe in einem Lehrbuch (Beginning PyQT) ein Verständnisproblem mit einer lambda Funktion:

Code: Alles auswählen

self.blue_act.triggered.connect(lambda:self.changeBackground(self.blue_act.text()))]
(Codeschnipsel Listing 8.2)

Was macht die lambda funktion oder kann mir jemand diese Funktion ohne lambda dahinschreiben?

Wie lautet der Slot mit dem das Signal verbunden wird?

Danke
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das lambda ist eine Funktion, und die stellt auch den Slot dar. Und ohne lambda muss man eine funktion definieren, wahlweise direkt davor als closure, der das self mit sich bringt, oder als (Bound) Method, oder als freistehende Funktion mit partial.

Die Dokumentation au lambda mal gelesen?
kitebuggy
User
Beiträge: 29
Registriert: Donnerstag 5. August 2021, 21:11

Warum muss man denn das lambda beutzen und nicht gleich self.blue_act.triggered.connect(self.changeBackground(self.blue_act.text())) benutzen? Es soll doch zu dieser Funktion gesprungen werden. Oder kann ich an dieser Stelle keine Parameter mit angeben?
Ich bin Anfänger. Bitte ausführlich erklären.

Danke
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil das dann einfach direkt ausgeführt wird, und der Rückgabewert (vermutlich None) zum Callback/Slot wird. Was ja Quatsch ist.

Es gibt keine Magie in Python, wo ein Ausdruck, der irgendwo steht & eine Methode/Funktion/Wasauchimmer aufruft, plötzlich durch ein Wunder NICHT aufgerufen wird. Entsprechend muss man dafür sorgen, dass das nicht passiert. Ein Lambda ist ein simpler Weg. functools.partial ein anderer, oder eben die genannten anderen Möglichkeiten.
Benutzeravatar
Dennis89
User
Beiträge: 1152
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich versuche der Erklärung von __deets__ noch ein Beispiel und die entsprechenden Links beizufügen.
kitebuggy hat geschrieben: Sonntag 28. August 2022, 14:13 Es soll doch zu dieser Funktion gesprungen werden.
[...]Bitte ausführlich erklären.
Aber erst wenn ein Ereignis eintritt und nicht wenn der Python-Interpreter beim Programmstart darüber stolpert.

Wenn du ein Klammerpaar hinter eine Funktion schreibst, dann wird die gleich ausgeführt.
Vielleicht erkennst du das an folgendem Beispiel:

Code: Alles auswählen

def do_something():
    return 'Funktion ausgeführt'


def main():
    print(do_something())
    print(do_something)

    
if __name__ == '__main__':
    main()
Du willst ja dass deine Funktion erst ausgeführt wird, wenn ein Ereignis eingetreten ist, also darfst du kein Klammerpaar schreiben. Du kannst aber auch nicht einfach so deine Parameter ohne Klammer hinter die Funktion schreiben, da wären wir wieder bei dem fehlenden Wunder, das __deets__ beschrieben hat. Damit du die Parameter übergeben kannst und die Funktion nicht sofort aufgerufen wird brauchst du 'lambda' oder url="https://docs.python.org/3/library/funct ... ls.partial"]'partial'[/url].


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
kitebuggy
User
Beiträge: 29
Registriert: Donnerstag 5. August 2021, 21:11

Ah, jetzt habe ich verstanden. Ein kleiner, aber feiner Unterschied.


Vielen Dank euch beiden für die Erklärung
Antworten