Telefonbuch aus byte of Python
In dem Du den Namen `name` nicht an das `Person`-Objekt bindest. Einen Namen innerhalb einer Funktion für so unterschiedliche Typen zu "recyclen" ist sowieso keine gute Idee, weil das bei längeren Programmen nur Verwirrung stiftet wenn man immer ganz genau hingucken muss an welcher Stelle nun welcher Typ an den Namen gebunden ist. `name` war ja *vorher* wirklich mal an den Namen gebunden.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Du sollst auch nicht Zeile 34, sondern 33+34 durch meine Zeile ersetzen.Cenz hat geschrieben:Also nach der Änderung wird die Meldung nur länger:
{<__main__.Person object at 0x7f53a9d3cf90>: <__main__.Person object at 0x7f53a9d3ced0>}
Das war dein erster Satz in diesem Thread und vielleicht wäre es nicht das schlechteste, einen Schritt zurück zu gehen, und zunächst einmal die Konstruktion eigener Klassen wegzulassen.Cenz hat geschrieben:Ich fange gerade an Python zu lernen, ist meine erste Sprache.
Experimentiere doch erst mal auf einer "niedrigeren Ebene" mit Dictionaries, etwa so:
Code: Alles auswählen
telefonbuch = {}
while True:
name = input("Gib deinen Nachnamen ein: ")
if name == "":
break
vorname = input("Dein Vorname: ")
stadt = input("Dein Wohnort: ")
telefon = input("Deine Telefonnummer: ")
telefonbuch[name] = {"Vorname":vorname, "Stadt":stadt, "Telefon":telefon}
for name in telefonbuch:
eintrag = telefonbuch[name]
print("\nEintrag für {0} {1}:".format(eintrag["Vorname"], name))
print("Wohnort: {0} Telefon: {1}".format(eintrag["Stadt"], eintrag["Telefon"]))
Habe ich auch anschließend gemacht, hat aber nicht viel an der Meldung geändert.cofi hat geschrieben:Du sollst auch nicht Zeile 34, sondern 33+34 durch meine Zeile ersetzen.Cenz hat geschrieben:Also nach der Änderung wird die Meldung nur länger:
{<__main__.Person object at 0x7f53a9d3cf90>: <__main__.Person object at 0x7f53a9d3ced0>}
Danke für die viele Hilfe, ich glaube ich lerne noch ein bisschen bevor ich mich wieder an das Projekt Wage.
Habe ich jetzt auch probiert, ich bekam wieder Fehlermeldungen.
Allerdings habe ich jetzt versucht ein Telefonbuch ohne Klassen zu programmieren.
Mein Problem ist allerdings das es nur eine Person speichert, nicht mehr.
Leider steht in Byte of Python nicht drin, wie man dieses Problem löst.
Es wäre schön wenn mir da jemand helfen könnte.
Allerdings habe ich jetzt versucht ein Telefonbuch ohne Klassen zu programmieren.
Mein Problem ist allerdings das es nur eine Person speichert, nicht mehr.
Leider steht in Byte of Python nicht drin, wie man dieses Problem löst.
Es wäre schön wenn mir da jemand helfen könnte.
Code: Alles auswählen
#/usr/bin/python
#Filename: xfonbuch.py
import pickle
personsfile = 'persons.data'
persons = {}
def addperson():
print('hinzufügen')
name = input('name?')
number = input('nummer?')
persons[name] = number
f = open(personsfile, 'wb')
pickle.dump(persons, f) # dump the object to a file
f.close()
def delperson():
print('löschen')
name = input('name?')
del persons[name]
def showpersons():
f = open(personsfile, 'rb')
storedpersons = pickle.load(f) # load the object from the file
print(storedpersons)
print('1: hinzufügen')
print('2: löschen')
print('3: zeigen')
do = input('Was möchtest du tun?')
if do == '1':
addperson()
if do == '2':
delperson()
if do == '3':
showpersons()
@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Das Problem liegt darin, dass du auch nur mit einer Person arbeitest
Konkret heisst das: Du schreibst beim Hinzufügen einer Person die ganze "Datenbank" neu, ohne jedoch die alte überhaupt geladen zu haben.
Die Lösung ist entweder dass du die "Datenbank" im Laufe des Programms im Speicher hälst, dh `persons` zu Beginn mit `pickle.load` initialisierst.
Hat auch den Vorteil, dass du nicht dauernd auf Dateien zugreifen musst. Generell bietet sich aber `shelve` mehr an als `pickle`, da ersteres sich schon wie ein Dictionary verhält und die Sache vereinfacht.
Konkret heisst das: Du schreibst beim Hinzufügen einer Person die ganze "Datenbank" neu, ohne jedoch die alte überhaupt geladen zu haben.
Die Lösung ist entweder dass du die "Datenbank" im Laufe des Programms im Speicher hälst, dh `persons` zu Beginn mit `pickle.load` initialisierst.
Hat auch den Vorteil, dass du nicht dauernd auf Dateien zugreifen musst. Generell bietet sich aber `shelve` mehr an als `pickle`, da ersteres sich schon wie ein Dictionary verhält und die Sache vereinfacht.
@BlckJack: Woran das lag war mir halbwegs klar, leider kannte ich keine Lösung für das Problem.BlackJack hat geschrieben:@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
@cofi: Hast du dir das so vorgestellt:
Code: Alles auswählen
personsfile = 'persons.data'
f = open(personsfile, 'rb')
storedpersons = pickle.load(f)
persons = {storedpersons}
File "dict.py", line 8, in <module>
persons = {storedpersons}
TypeError: unhashable type: 'dict'
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Nein, so hab ich mir das nicht vorgestellt.
Dictionary-Literale sehen so aus `{key : value}`.
Es reicht wenn du dein Snippet so änderst:
Dictionary-Literale sehen so aus `{key : value}`.
Es reicht wenn du dein Snippet so änderst:
Code: Alles auswählen
personsfile = 'persons.data'
f = open(personsfile, 'rb')
persons = pickle.load(f)