Telefonbuch aus byte of Python

Code-Stücke können hier veröffentlicht werden.
BlackJack

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Cenz hat geschrieben:Also nach der Änderung wird die Meldung nur länger:
{<__main__.Person object at 0x7f53a9d3cf90>: <__main__.Person object at 0x7f53a9d3ced0>}
Du sollst auch nicht Zeile 34, sondern 33+34 durch meine Zeile ersetzen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Cenz hat geschrieben:Ich fange gerade an Python zu lernen, ist meine erste Sprache.
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.

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"]))
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

cofi hat geschrieben:
Cenz hat geschrieben:Also nach der Änderung wird die Meldung nur länger:
{<__main__.Person object at 0x7f53a9d3cf90>: <__main__.Person object at 0x7f53a9d3ced0>}
Du sollst auch nicht Zeile 34, sondern 33+34 durch meine Zeile ersetzen.
Habe ich auch anschließend gemacht, hat aber nicht viel an der Meldung geändert.

Danke für die viele Hilfe, ich glaube ich lerne noch ein bisschen bevor ich mich wieder an das Projekt Wage. :D
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das kann nicht sein, denn in Zeile 33 überschreibst du `name` mit dem `Person`-Objekt was eben zu dem seltsamen und unbrauchbaren Dictionary-Mapping führt.
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

{'dfs': <__main__.Person object at 0x7f0c408bef90>}

So sieht die Ausgabe aus, wenn ich das geändert habe. dfs ist die Person die ich eingegeben habe.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das ist es doch aber auch.
Wenn du etwas lesbares willst, solltest du dir Rebeccas Post noch einmal anschauen.
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

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.

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()
BlackJack

@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
Benutzeravatar
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.
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

BlackJack hat geschrieben:@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
@BlckJack: Woran das lag war mir halbwegs klar, leider kannte ich keine Lösung für das Problem.

@cofi: Hast du dir das so vorgestellt:

Code: Alles auswählen

personsfile = 'persons.data'
f = open(personsfile, 'rb')
storedpersons = pickle.load(f)
persons = {storedpersons}
Ich bekomme dann aber das hier als Ausgabe:
File "dict.py", line 8, in <module>
persons = {storedpersons}
TypeError: unhashable type: 'dict'
Benutzeravatar
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:

Code: Alles auswählen

personsfile = 'persons.data'
f = open(personsfile, 'rb')
persons = pickle.load(f)
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

Danke sehr :D :D :D :D :D :D :D
Antworten