Viele Variable an Funktion übergeben

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich habe in meinem Programm eine Funktion zur Bearbeitung von Bildern geschrieben, an die ich viele Parameter übergeben muss.
    Damit werden z. B. Texte an bestimmten Positionen auf das Bild gesetzt.

    Jetzt ist es so, dass der Funktionsaufruf aufgrund der vielen Variable (ca. 20) recht unübersichtlich und lange ist.

    Wie übergebe ich die Variable am besten, so dass es auch übersichtlich bleibt?

    Globale Variable verwenden?
    Alle Variable in eine Liste zusammenfassen (wobei das dann auch nicht wirklich übersichtlich und transparent erscheint)?

    Danke.

  • Globale Variable verwenden?

    Nein.

    Zitat

    Alle Variable in eine Liste zusammenfassen (wobei das dann auch nicht wirklich übersichtlich und transparent erscheint)?

    Wäre eine Möglichkeit, oder als Dictionary.

    Darf man sich den Quelltext von dir ansehen? Offen gestanden, wenn eine Funktion ansich schon 20 Werte als Übergabeparameter haben will, scheint da noch was anderes im Argen zu liegen... Vielleicht gibts eine leichtere Methode, das von dir gewünschte Verhalten zu programmieren...

  • Eine Liste ist die Lösung. Nehmen wir an pro Text wären nur Position & Text zu definieren. Dann könnte man die eingebauten tupel nehmen:

    texts = [(100, 200, "Hallo"), (50, 300, "Welt"), ...]
    for x, y, text in texts:
    ....


    Gesendet von iPhone mit Tapatalk

  • Hallo,

    letztendlich muss du ja immer die 20 Werte hinschreiben - sei es als Liste oder Dict und diese dann die Funktion übergeben oder im Funktionsaufruf. Und selbst wenn du eine Klasse mit 20 Attributen hast, muss du halt die 20 Attribute setzen (BTW: fabio - Python braucht keine Getter- und Setter, es gibt den direkten Attributzugriff)

    Wenn du die Argumenten weiterhin im Funktionsaufruf einzeln unterbringst, dann würde ich zumindest Keyword-Argumente nehmen, damit es ein bisschen übersichtlich ist, also z.B:

    [code=php]def my_func(foo=None, bar=None, spam=None):
    ....
    return the_result

    result = my_func(foo=200, bar=100, spam='some text')
    [/php]

    Gruß, noisefloor

    Einmal editiert, zuletzt von noisefloor (7. September 2016 um 12:23)

  • Wie wäre es mit *args ?

    [code=php]
    def machwas(text, *args):
    print "hallo %s" % text
    for arg in args:
    print arg

    machwas('schousda', 1, 2, 3)
    machwas('schousda', 1, 2, 3, 'bla', 'blub', 6)
    [/php]

    Oder **kwargs:
    [code=php]
    def machwas(text, **kwargs):
    print "hallo %s" % text
    for key in kwargs:
    print kwargs[key]

    machwas('schousda', arg1=1, arg2=2, arg3=3)
    machwas('schousda', arg1=1, arg2=2, arg3=3, arg4='bla', arg5='blub', arg6=6)
    [/php]

    Ansonsten würde ich auch zu einem Dictionary tendieren was du dann entweder a) ausserhalb einer Funktion initialisierst , oder b) an die entsprechende Funktion übergibst:
    a)
    [code=php]
    def machwas():
    for key in dictionary:
    print "%s: %s" % (key, dictionary[key])

    dictionary=dict()
    dictionary.update({"bla": "blubber"})
    dictionary.update({"grad": 456})
    machwas()
    dictionary.update({"grad": 789})
    machwas()
    [/php]
    b)
    [code=php]
    def machwas(d):
    for key in d:
    print "%s: %s" % (key, d[key])

    def machmehr():
    dictionary=dict()
    dictionary.update({"bla": 123})
    dictionary.update({"blub": 456})
    machwas(dictionary)

    machmehr()
    [/php]

    Ich würde hierbei zu letzterem tendieren. Ansonsten die Möglichkeit welche deets nannte.

    Damit wärst du am flexibelsten.

  • Hallo,

    hier mal meine Funktion, mit der ich die Bilder bearbeite:

    Evtl. könnte man das schreiben der einzelnen Text nochmals in eine seperate Funktion ausgliedern, aber dazu muss ich das Bild dann mehrfach bearbeiten. Da bin ich mir dann nicht so sicher, ob nicht die Qualität mehr und mehr leidet.

    Bin aber natürlich für Ratschläge offen.

  • Die "klass"ische Lösung sind Klassen:

    Damit entkoppelst du verschiedene Text-Elemente und ihre Platzierung. Kann man natürlich noch um Font etc. ergänzen.

    Deine Befürchtungen bezüglich leidender Qualität sind Unfug. Pixel rotten nicht. Sofern du das Bild nicht permanent verlustbehaftest (also JPEG) speicherst, lädst, was malst, speicherst, lädst, was malst... usw, passiert da genau gar nix.

  • Hallo,

    du hast eine große, monolithische Funktion gebaut. Macht man normalerweise nicht. U.a genau aus dem Grund, weswegen du den Thread hier gestartet hast.

    Normalerweise packt man das in viele kleine Funktionen (bei dir: jeder Abschnitt, über dem ein Kommentar steht, ist eine eigene Funktion. Und das ganze kann man dann noch in eine Klasse packen. Und in der Klasse kann man ggf. noch generischen Funktionen wie von __deets__ gezeigt einbauen.

    Gruß, noisefloor


  • Zeig doch mal den kompletten Code damit man das Zusammenspiel auch erkennt -- ansonsten zuckt man jetzt genau so wie zuvor auch schon mit den Schultern und fragt sich "whaaaat?"


    Vorher nehme ich das Bild nur mit der Raspberry Camera auf und übergebe das dann zur weiteren Verarbeitung an die Funktion.

    Ich werde mal versuchen, so wie ihr vorgeschlagen habt, mein Programm besser zu gliedern, so dass ich a) nicht alle Variablen an eine Funktion schicke und b) ich dadurch auch noch sich wiederholenden Code einsparen kann.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!