Funktionszuordnung in Liste führt diese jeweils aus

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
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Wenn man die Funktionen mit Klammer mit Klammer und args in die Liste einträgt, wird die Funktion erstmal ausgeführt.

Code: Alles auswählen

test = [event_eins(), event_zwei(True), event_drei(False, 30)]
Ich bin auf diese Lösung gekommen.
Kann man diese Prozedur auch besser lösen?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def event_eins():
    print '1'

def event_zwei(state):
    print '2', state

def event_drei(state, number):
    print '3', state, number

def main():
    test = [[event_eins,()], [event_zwei,(True,)], [event_drei,(False, 30)]]
    for function, args in test:
        function(*args)

if __name__ == '__main__':
    main()
empty Sig
BlackJack

@harryberlin: `functools.partial()` wäre noch eine Möglichkeit um die Parameter an die Funktion zu binden.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

aber an der liste lässt sich sonst nichts weiter reduzieren? bin nicht unbedingt ein freund von liste in der liste, in der liste. macht es irgendwann unübersichtlich.
empty Sig
BlackJack

@harryberlin: Doch, mit `functools.partial()` wären in der Liste dann direkt Funktionsobjekte die man aufrufen kann und die kein Argument mehr erwarten. Mit ``lambda``-Ausdrücken ginge das auch.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

dann hab ich es wohl falsch verstanden, dass es nur sinn macht, wenn man immer wieder die gleiche funktion nutzen will.
mal schaun, vllt. komm ich noch dahinter.
empty Sig
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

harryberlin hat geschrieben:dann hab ich es wohl falsch verstanden, dass es nur sinn macht, wenn man immer wieder die gleiche funktion nutzen will.
Das machen deine Beispiele doch auch.

Code: Alles auswählen

from __future__ import print_function
from functools import partial

func = partial(print, 1, 2, 3)
func()

# ...ist das gleiche wie:
print(1, 2, 3)
Sofern dies nicht tut, was du dir vorgestellt hast, dann erkläre mal mit eigenen Worten, was dein Ziel ist.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du kannst natürlich auch sowas machen:

Code: Alles auswählen

print_info = partial(print, 'INFO:')
print_info('Irgendein Text')
print_info('Noch ein Text')
...mal unabhängig davon, dass dies nur eine andere Schreibweise hierfür ist:

Code: Alles auswählen

def print_info(text):
    print('INFO:' text)
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Wenn man es so betrachtet, dann stimmts. Habe hier zur Vereinfachung fast ziemlich gleiche Funktionen mit "print".
Aber eigentlich möchte ich es für unterschiedlichste Funktionen nutzen. Mal mit, mal ohne Argumente.

Danke für dein Beispiel, das hab ich jetzt glaub verstanden.
empty Sig
Antworten