Seite 1 von 1

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

Verfasst: Samstag 22. April 2017, 15:22
von Sophus
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?

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

Verfasst: Samstag 22. April 2017, 15:42
von __deets__
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)

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

Verfasst: Samstag 22. April 2017, 15:44
von Sophus
@__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.

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

Verfasst: Samstag 22. April 2017, 15:51
von __deets__
Man kann das auch mit lambdas machen. lambda x, y, foo=bar: self.methode(x, y)

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

Verfasst: Samstag 22. April 2017, 15:52
von Sophus
@__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?

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

Verfasst: Samstag 22. April 2017, 15:59
von Sophus
__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)

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

Verfasst: Samstag 22. April 2017, 17:32
von __deets__
Ja. Aber kannst ja auch schnell ausprobieren, oder? :roll:

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

Verfasst: Samstag 22. April 2017, 17:49
von Sophus
@__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