Neben den "internen" Parametern auch "externe" Parameter übermitteln?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

meine Betreffzeile ist wohl nicht ganz aussagekräftig. Daher habe ich für euch einen Pseudo-Quelltext zusammen geschustert, um mein Anliegen etwas deutlicher zu machen. Im diesem Pseudo-Beispiel verbinden wir blah_blah_tree_view zunächst mit der selectionModel()-Funktion, welcher die Selection Model zurückliefert, und im Anschluss setzen wir das selectionChanged()-Signal an, welcher zwei Parameter beinhaltet, die dann durch die connect()-Funktion direkt und "intern" an die handle_selection_changed()-Methode übergibt. Das meine ich zunächst mit "intern". Wir haben darauf keinen Einfluss. Das selectionChanged()-Signal übergibt zwei Parameter. Soweit auch alles kein Problem.

Code: Alles auswählen

[...]
self.blah_blah_tree_view.selectionModel().selectionChanged.connect(self.handle_selection_changed)

    def handle_selection_changed(self, newIndex, oldIndex=None):
         #do something with two parameters
[...]
Aber: Was ist, wenn ich jetzt hingehe, und zusätzlich, zu den beiden "internen" Parametern noch explizit eigene Parameter übergeben möchte?
Wie ich das meine? Schauen wir uns wieder einen Pseudo-Quelltext an.

Code: Alles auswählen

[...]
self.blah_blah_tree_view.selectionModel().selectionChanged.connect(lambda. self.handle_selection_changed(explizit_arg="BlahBlah"))

    def handle_selection_changed(self, newIndex, oldIndex=None, explizit_arg=None):
         #do something with two parameters
[...]
Wenn ich das mit der lambda-Funktion bewältigen möchte, dann schlägt diese Überlegung ganz klar fehl. Es ist also für mich nicht möglich, dass ich zusätzlich zu den "internen" Parametern eigene explizite Parameter anfügen kann? So dass ich am Ende sowohl die "internen" Parametern als auch "externe"-Parameter übergeben und damit arbeiten kann?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht mit functools partial, und das dir das hier noch nie empfohlen wurde oder über den Weg lief kann ich fast nicht glauben.

Code: Alles auswählen

from functools import partial 

f = partial(handle_selection_changed, param=123)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Ich kenne partial durchaus. Nur habe ich es nie benutzt, da ich annahm, dass lambda das auch erledigt. Denn mit lambda konnte ich ebenfalls Argumente übergeben. dann probiere ich mal partial aus, und hoffe, dass es klappt.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann das auch mit lambdas machen. lambda x, y, foo=bar: self.methode(x, y)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Scheint zu klappen. Danke. Aber eine Frage. Wieso klappt das mit lambda nicht? Ich meine, es ist ja durchaus üblich, dass man in einer connect()-Funktion lambda verwendet, wenn man der damit verbundenen Methode Argumente übergeben will. Nichts anderes macht particals augenscheinlich auch. Einer Methode wird ein zusätzliches Argument übergeben?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

__deets__ hat geschrieben:Man kann das auch mit lambdas machen. lambda x, y, foo=bar: self.methode(x, y)
Musst du nicht auch das Argument foo bei der Parameterübergabe mit anhängen?
Etwa so?

Code: Alles auswählen

lambda x, y, foo=bar: self.methode(x, y, foo)
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Aber kannst ja auch schnell ausprobieren, oder? :roll:
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Nicht gleich mit den Augen rollen, wenn ich dich auf einen Fehler hinweise :) Das Forum ist ja öffentlich zugänglich und die Leser sollen ja nicht in Versuchung geführt werden :D
Antworten