"Notizen Programm" - Feedback

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
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Sirius3 hat geschrieben:@HarteWare: Funktionen mit Argumenten rufst Du auf, indem Du die Argumente in den Klammern angibst. Wo ist das Problem?
Naja, das wird ja für alle Funktionen in einer Zeile verallgemeinert durch

Code: Alles auswählen

menu[index][1]()
oder so in der Art.

Wenn ich aber zum Beispiel für die eine Funktion Argument a und für die andere Argument b oder gar keins will, dann muss ich ja irgendwie unterscheiden. Und ich frag mich halt, obs da ne gute Art gibt, oder ob ich halt mit if Abfragen etc. das machen muss
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher kommen die Argumente? Woher weiß das Programm, dass es ein Argument a oder b gibt?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du meinst, falls die Funktionen *unterschiedliche* Argumente bekommen müssen? In diesem Falle gibt es verschiedene Möglichkeiten.

Wenn Du immer einen Container mit Adressedaten übergeben willst und in einigen Fällen nichts, so kannst Du einfach die Funktionen so definieren:

Code: Alles auswählen

def func_with_param(adresses):
    # do something with param

def another_func_with_same_param(adresses):
    # do something with param

def func_without(*args):
    # do something *without* using params!
    # we just ignore it!

# die Funktionen einfach *immer* mit Parameter aufrufen
menu[index](adresses)
Wenn Du unterschiedliche Parameter übergeben willst, wird es kniffliger. Dann könntest Du mittels ``functools.partial`` die Funkionen einmalig zu Beginn an die zu übergebenden Objekte binden und hättest immer noch *einen* Aufruf.

So in der Art:

Code: Alles auswählen

from functools import partial

def func_1(arg):
    print(arg)

adresses = [
    {"name": "Foo", "town": "FooTown"},
    {"name": "Bar", "town": "BarTown"}
]

func_1_call = partial(func_1, adresses)
# func_1_call trägst Du in die Menüstruktur ein!

# eigentlich durch ``menu[index]()``
func_1()_call()
> [{'town': 'FooTown', 'name': 'Foo'}, {'town': 'BarTown', 'name': 'Bar'}]
Ändert sich nun im Laufe des Programms das Adressen-Objekt, so wird das ebenfalls durch das ``partial``-Objekt weitergeleitet (logisch, da Du auf demselben Objekt arbeitest!)

Code: Alles auswählen

adresses.append({"name": "FooBar", "town": "FooBarTown"})

func_1_call()
> [{'town': 'FooTown', 'name': 'Foo'}, {'town': 'BarTown', 'name': 'Bar'}, {'town': 'FooBarTown', 'name': 'FooBar'}]
Dies wäre ein Weg, der mir spontan einfiele.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

@Sirius
Ich dachte halt, ich lade in der main() alle Addressen in eine Liste und arbeite dann auf der Liste und am Ende wird die Liste wieder in die Datei geschrieben (mit pickle).
Und wenn ich jetzt z.B. eine Addresse hinzufügen will, übergeb ich dann diese Liste als Argument an eine Funktion, die die Daten eingeben lässt und dann ein entsprechendes Addresse Objekt an die Liste anhängt.
Ich habe einfach Schwierigkeiten mit diesem Menü Design, sobald die dazugehörigen Funktion mehr machen als nen einfaches print() oder so. Auf der anderen Seite sehe ich schon, dass es so viel geschickter ist. Aber wenn ich z.B. in der main() irgendwas habe, dann kennen diese anderen Funktionen das garnicht. Daher weiß ich nicht recht, wie ich zwischen den verschiedenen Teilen richtig interagieren soll. Vielleicht gehe ich das Ganze auch einfach falsch an...

@Hyperion
Hab grad vorm abschicken deinen Post gesehen. Ich werd mal schauen ob ich was umsetzten kann, danke. Ich meld mich dann nochmal

LG
Antworten