_nohtyp_ hat geschrieben:
Du solltest für die Schlüssel in deinem Dictionary Konstanten verwenden.
Und dann den entsprechenden Schlüssel durch z.B.
ersetzen?
Nee, um Gottes Willen nein. Sondern z.B. so:
Code: Alles auswählen
NAME = "name"
VORNAME = "vorname"
...
# und zur Verwendung
adresse[NAME]
Der Vorteil davon, den EyDu meinte, kannst Du schnell begreifen, wenn Du aus ``name`` nun lieber ``nachname`` machen willst. Jetzt müsstest Du nur die Definition Deiner Konstanten ändern, der Rest vom Code bliebe gleich.
Ich selber wäre mir aber nicht sicher, ob ich das wirklich machen wollen würde. Ist hier vielleicht ein wenig Geschmackssache. Imho ist der Name eines Schlüssels in dieser Problemdomäne vergleichbar mit einem Attributsnamen einer Klasse. Wenn ich den ändern will, muss ich normaler Weise gute Gründe haben und eh refactoring betreiben
Ich finde aber andere Dinge eher verbesserungsbedürftig. Du verfällst schon wieder in das Muster, *zu viel* und vor allem *unterschiedliche* Dinge in *eine* Funktion zu packen!
Nehmen wir ``suchen`` mal als Beispiel, ich habe meine Kritik als Kommentare hinein geschrieben:
Code: Alles auswählen
def suchen(adressen, gesucht):
"""Adresse wird gesucht. Nutzer wählt aus Ergebnissen Suche Eintrag."""
# ich würde ``suche`` eher ``such_ergbenisse`` oder nur ``ergebnisse`` oder
# ``gefunden`` nennen.
suche = []
for adresse in adressen:
if gesucht.lower() in [x.lower() for x in adresse.values()]:
suche.append(adresse)
# hier müsste eigentlich Schluss sein! Gib das Ergebnis zurück und gut ist!
# wieso nutzt Du nicht die Funktion für die Ausgabe von *mehreren* Adressen?
# nichts anderes ist doch in ``suche`` enthalten.
# eine wichtige Fähigkeit beim Programmieren ist es, wiederkehrende Aufgaben
# zu kapseln und darauf zurückzugreifen.
for idx, ergebnis in enumerate(suche, 1):
print("{}: {}".format(idx, ergebnis))
# Benutzereingaben / Entscheidungen gehören nicht in eine Funktion,
# die schlicht "suchen" soll. Du kannst hier gar nicht wissen, ob
# evtl. auch etwas mit *allen* Resultaten gemacht werden soll!
auswahl = input("Welche Adresse haben Sie gesucht? >> ")
try:
auswahl = int(auswahl)
except (ValueError, IndexError) as e:
print(e)
suchen(adressen, gesucht)
else:
return suche[auswahl - 1]
Ähnliches gilt für das Löschen oder auch das Ändern. Schreibe erst einmal nur Funktionen, die wirklich diese Dinge *tun* - ohne Nachfrage und ohne weitere Eingaben. So etwas regelst Du außerhalb und vor dem Aufruf einer Funktion.
Denk daran, dass Du ursprünglich eine GUI für dein Adressbuch haben wolltest. "Dank" der Mischung von Eingaben und dem Erledigen von Aufgaben in *einer* Funktion, kannst Du diese für eine GUI nicht mehr verwenden und müsstest das komplett neu schreiben. Den Prompt eines ``input`` siehst Du in einer GUI ja gar nicht! Du musst also schon bei der Benutzung über eine Textshell darauf achten, dass alle Eingaben und Ausgaben getrennt von der Kernfunktionalität stattfinden! Denn letztlich ist das auch schon eine Form von GUI - nur ohne das "G"
Vielleicht noch als Hinweis für die Gestaltung von solchen Textmenüs:
Tutorial