Optimierung eines Telefonbuchs
Hallo.
Zunächst zu dem "Phonebook": Das kommt davon, wenn man Variablen mit einem Großbuchstaben beginnt Ich bin davon ausgegangen, dass es eine Klasse ist und habe keine Zeile weiter nach oben geschaut.
Zu deinem Dateiproblem: In Zeile 8 öffnest du die Datei nur zum Lesen, dann kannst du in Zeile 17 nicht einfach etwas hineinschreiben. Du musst sie also zum Lesen und Schreiben öffnen. Schau dir mal die Parameter zu "open" an.
Dein Syntax-Fehler (poste doch bitte nächstes Mal den ganzen Traceback) ist einfach zu lösen und sagt eigentlich schon die Meldung: Du kannst einer Funktion keine Parameter so übergeben, dass zunächst einem Parameter ein Standardwert zugewiesen wird und dem dahinter nicht. Wie soll das eindeutig ausgewertet werden. Was bedeutet dispatch(1)? Heißt dass, dass choice=1 ist und hello fehlt, oder dass hello=1 und choice="f"?
Zunächst zu dem "Phonebook": Das kommt davon, wenn man Variablen mit einem Großbuchstaben beginnt Ich bin davon ausgegangen, dass es eine Klasse ist und habe keine Zeile weiter nach oben geschaut.
Zu deinem Dateiproblem: In Zeile 8 öffnest du die Datei nur zum Lesen, dann kannst du in Zeile 17 nicht einfach etwas hineinschreiben. Du musst sie also zum Lesen und Schreiben öffnen. Schau dir mal die Parameter zu "open" an.
Dein Syntax-Fehler (poste doch bitte nächstes Mal den ganzen Traceback) ist einfach zu lösen und sagt eigentlich schon die Meldung: Du kannst einer Funktion keine Parameter so übergeben, dass zunächst einem Parameter ein Standardwert zugewiesen wird und dem dahinter nicht. Wie soll das eindeutig ausgewertet werden. Was bedeutet dispatch(1)? Heißt dass, dass choice=1 ist und hello fehlt, oder dass hello=1 und choice="f"?
Das Leben ist wie ein Tennisball.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja und da hast Du aber open() nicht gesagt, dass Du Lesen ("r") möchtest, sondern Schreiben ("w")!Seeker hat geschrieben: Wie darf ich das verstehen?
Ich habe ja zwei Wege:
1) Die Datei existiert schon, dann wird sie geöffnet und das Dictionary durch cPickle geladen.
Ich habe jetzt gesehen, dass Du die Datei offen lässt und aus der Funktion dann in interactive wechselst! Das ist Mist! Mach das anders. Am Schluss läuft es immer darauf hinaus, dass Änderungen als eine neue Datei gespeichert werden müssen. Schreib also eine Funktion, die genau das abdeckt. Den Rumpf dazu hatte ich Dir ja schon gepostet. Als Parameter braucht die dann eben einen Dateinamen und das Telefonbuch.2) Die Datei existiert nicht, dann wird sie geschrieben, geöffnet und ein leeres Dictionary wird erstellt.
Dann schreib eine Funktion, die eine Datei öffnet und ein Telefonbuch aus den daten erstellt. (Ebenfalls mein "Template" dazu nutzen). Hier musst Du nur evtl. ein "leeres" Telefonbuch zurückgeben, wenn die Datei eben nicht existiert.
Diese beiden Funktionen musst Du nun aus Deinem Menü heraus aufrufbar machen. Während der Benutzer arbeitet sind alle Dateien immer geschlossen!
Sorry, war mein Fehler. Die Reihenfolge zwischen default und non-default-Argumenten spielt in Python natürlich eine Rolle:Jetzt spezifisch:
Das mit dem Template habe ich schlussendlich so halbwegs hingekriegt, aber dispatch will einfach nicht klappen =/.
Code: Alles auswählen
# richtig
def foo(bar, choice="f")
pass
# falsch
def foo(choice="f", bar)
pass
Code: Alles auswählen
# durch das * kannst Du beliebig viele non-default Parameter übergeben!
def dispatch(choice, *args):
mapping = {"a": apple,
"b": bee,
"c": cedar}
try:
mapping[choice](args)
except KeyError:
print "Sorry, Kommando '{0}' unbekannt".format(choice)
Wozu der Rückfall zu so einer schlechten Lösung?Ich werde mir noch überlegen, das ganze vielleicht doch wieder zurückzuwandeln, wie es früher war. d.h. ich würde die Personen statt in einem Dictionary in einer Liste speichern und durch verschiedene if's das Print-Statement machen.
Danke für die Antworten =)!
Ich hätte noch betonen sollen, dass ich dein Template nicht ignoriert hatte, sondern schon eingebaut hatte, nur nicht ganz funktionsfähig ^^.
Aber der andere Hinweis hat mich auf die richtige Spur gebracht.
Die Datei wird neuerdings gleich nach dem öffnen/erstellen und ggf. dem pickle.load wieder geschlossen. Beim schliessen des Programms wird die Datei dann wieder im "w" Mode geöffnet und das Telefonbuch durch pickle.dump abgelegt.
Aber es gibt sie mir so an:
Neu:
http://paste.pocoo.org/show/141297/
In Zeile 8 öffnest du die Datei nur zum Lesen, dann kannst du in Zeile 17 nicht einfach etwas hineinschreiben.
...aber ist mein Fehler.Ja und da hast Du aber open() nicht gesagt, dass Du Lesen ("r") möchtest, sondern Schreiben ("w")!
Ich hätte noch betonen sollen, dass ich dein Template nicht ignoriert hatte, sondern schon eingebaut hatte, nur nicht ganz funktionsfähig ^^.
Aber der andere Hinweis hat mich auf die richtige Spur gebracht.
Die Datei wird neuerdings gleich nach dem öffnen/erstellen und ggf. dem pickle.load wieder geschlossen. Beim schliessen des Programms wird die Datei dann wieder im "w" Mode geöffnet und das Telefonbuch durch pickle.dump abgelegt.
omg... das hätt ich eigentlich auch selber gewusst :/... habs ja x mal gelesen ^^. Irgendwie ... keine Ahnung, Wand vor den Augen .Sorry, war mein Fehler. Die Reihenfolge zwischen default und non-default-Argumenten spielt in Python natürlich eine Rolle
Das Telefonbuch funktioniert mittlerweilen super. Allerdings wollte ich eigentlich die Ausgabe so haben (so war die Ausgabe mit der Liste):Wozu der Rückfall zu so einer schlechten Lösung?
Code: Alles auswählen
Name: Mr. Smith
Tel. Number: 234 234 23 23
Mob. Number: 875 453 43 85
Occupation: Agent
Address:
Fleestreet 10
95748 Witchtown
Email: thecakeisalie@portal.com
Code: Alles auswählen
Name: Mr. Smith
Tel. Number: 234 234 23 23
Mob. Number: 875 453 43 85
Occupation: Agent
Address: Fleestreet 10\n95748 Witchtown
Email: thecakeisalie@portal.com
http://paste.pocoo.org/show/141297/
ich hab mir den Code zwar nicht angeschaut, aber es dürfet an dem liegen:
die 3 Prints kann man auch z.B. mit ersetzten
wenn meine Vermutung stimmt muss du hinter die Print-Anweisung eine Komma setzten
mfg[/code]
Code: Alles auswählen
>>> def a():
print 'a'
print 'b'
print 'c'
>>> a
<function a at 0x011BF1F0>
>>> a()
a
b
c
>>> def a():
print 'a',
print 'b',
print 'c',
>>> a
<function a at 0x011BF8B0>
>>> a()
a b c
Code: Alles auswählen
abc = ['a', 'b', 'c']
for i in abc:
print i
wenn meine Vermutung stimmt muss du hinter die Print-Anweisung eine Komma setzten
Code: Alles auswählen
print 'Hallo',
the more they change the more they stay the same
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Also glaub mir doch mal: Deine organize_file() Funktion ist Mist! Zum einen brauchst Du kein "finally:" mehr durch das with-Statement, zum anderen sind da viele sinnlose Abläufe drin.
Mal das ganze kommentiert:
Also noch einmal zusammenfassend: Dein Konzeot ist hier umständlich, unsauber und gefährlich! Versuche es doch so zu lösen, wie ich es Dir davor schon beschrieben haben. Eine Funktion fürs Öffnen und Einlesen, eine separate fürs Speichern. Beides sollte im Menü anwählbar sein; also einmal ein Befehl zum Öffnen und einmal einer zum Speichern. Wird Dir viel einfacher fallen, glaub mir!
Wieso das mit der Ausgabe nicht so klappt weiß ich aus dem Stehgreif auch nicht. Muss damit zusammenhängen, dass das Steuerzeichen "\n" wohl irgend wie escaped ist...
Mal das ganze kommentiert:
Code: Alles auswählen
def organize_file():
# würde ich als Parameter übergeben, ggf. eben als default-Parameter
phonebookfile = "phonebook.data"
try:
with open(phonebookfile) as f:
pb = pickle.load(f)
f.close()
# das ist Käse! Man würde von der Funktion manage_file nicht erwarten, dass
# diese eine andere (dazu noch mit endlos loop)
# aufruft
manage_menu(pb)
except IOError:
# wieso willst Du mit dem Dateinamen erneut arbeiten
# der hat ja wohl Probleme verursacht!
# zudem vollkommen überflüssig - wozu eine leere Datei schreiben?
# außerdem eine neue Fehlerquelle! Was passiert,
# wenn open() hier eine Exception auslöst?
f = open(phonebookfile, "w")
f.close()
# vollkommen umständlich die 3 Zeilen!
# manage_menu(dict()) tut das selbe
phonebook = {}
pb = phonebook
manage_menu(pb)
# durch das with überflüssig - in finally sollte Aufräumarbeiten stattfinden,
# wie z.B. das Schließen von Dateien
# außerdem eine neue Fehlerquelle, wie oben!
finally:
f = open(phonebookfile, "w")
pickle.dump(pb, f)
f.close()
Wieso das mit der Ausgabe nicht so klappt weiß ich aus dem Stehgreif auch nicht. Muss damit zusammenhängen, dass das Steuerzeichen "\n" wohl irgend wie escaped ist...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
@Dav1d: Nein!
Ich hab mir grad noch mal das angeguckt: Wieso heißt das noch tell()? Mich wundert, dass das überhaupt klappt!
Ich hab mir grad noch mal das angeguckt: Wieso heißt das noch tell()? Mich wundert, dass das überhaupt klappt!
Code: Alles auswählen
# wieso person_info - das ist doch bei dir eine "person", also würd ichs auch so nennen
def tell(person_info):
# wieso haben die Keys hier einen ":" dran? Das sollte einen Fehler geben!
order = ['Name:', 'Tel. Number:', 'Mob. Number:',
'Occupation:', 'Address:', 'Email:']
for key in order:
try:
print "%s %s \n" %(key, person_info[key])
except KeyError:
pass
def display_all(pb):
# i ist mist! wieso nicht "person"?
for i in pb.values():
tell(i)
print "*"*45
Ich war Essen, hatte also noch keine Zeit mich ums öffnen/schliessen etc. zu kümmern.
Aber nur kurz zur Erklärung:
Aber ich mach mich zuerst mal ans Grundgerüst, danach kann ich Namen immer noch ändern.
*EDIT*:
Tut mir echt leid... aber ich verstehe irgendwie immer noch nicht, was am file-management so falsch war. Vielleicht sehe ich einfach etwas völlig falsch. Ich erklär mal wie ichs mir gedacht hab (arbeite unterdessen trotzdem mal an deinem Vorschlag):
Aber nur kurz zur Erklärung:
Es hiess tell(), weil ich ursprünglich ein Grundgerüst aus "Byte of Python" genommen hatte, wo tell() benutzt wurde. Mir persönlich gefällt der name tell() einfach, da ich das phonebook sozusagen nach einer Person frage und er mir was über sie "erzählt". k.A., ich fands jetzt nicht so tragischWieso heißt das noch tell()
Es heisst person_info, weil es das "innere" Dictionary ist. Im phonebook sind ja die verschiedenen Personen als Keys drin, und deren Values (wiederum Dictonaries) habe ich halt person_info genannt, weil dort die einzelnen Infos über eine Person enthalten sind.# wieso person_info - das ist doch bei dir eine "person", also würd ichs auch so nennen
Weil ich am Anfang für alle for ... in... jeweils i benutzt habe und erst nachträglich gewisse verändert habe.# i ist mist! wieso nicht "person"?
Aber ich mach mich zuerst mal ans Grundgerüst, danach kann ich Namen immer noch ändern.
*EDIT*:
Tut mir echt leid... aber ich verstehe irgendwie immer noch nicht, was am file-management so falsch war. Vielleicht sehe ich einfach etwas völlig falsch. Ich erklär mal wie ichs mir gedacht hab (arbeite unterdessen trotzdem mal an deinem Vorschlag):
Code: Alles auswählen
def organize_file():
'''Takes care of the opening/creating, processing,
and saving the file'''
try: #Versuch, das phonebookfile zu öffnen. Falls es existiert, wird
#es geladen.
f = open("phonebook.data")
pb = pickle.load(f)
f.close()
manage_menu(pb) #zugegeben, dies ist nicht schön. Aber andersrum machts noch
#Sinn: Ich öffne das Phonebook (ohne dieses macht das
#ganze Programm ja keinen Sinn), arbeite dran so lang
#rum wie ich wünsch, und dann wird es automatisch
#gespeichert.
except IOError: #Diese Exception kommt, wenn das File noch nicht existiert,
#d.h. das Programm zum ersten Mal ausgeführt wird.
f = open(phonebookfile, "w")
f.close() #Das erstellen und schliessen eines leeren File verhindert,
#dass ich mich beim pickle.dump und schliessen der File
#darum sorgen muss, ob das File nun zu Beginn existierte oder nicht
manage_menu(pb = {}) #siehe oben
finally:
f = open(phonebookfile, "w") #dieser Punkt wird erreicht, wenn ich mit
#"break" den loop beende. Die Datei existiert
#sicher, dafür wurde schon gesorgt.
#also einfach öffnen, dumpen, schliessen.
pickle.dump(pb, f)
f.close()
Soo... neuer Versuch
Das Programm ist nun so aufgebaut:
main:
----loop:
-------input(wahl)
-------load pb
-------save pb
-------change pb
-----------loop: (wahl wie bisher)
-------exit
Das Programm ist irgendwie launisch. Zum Teil funktioniert es so halb, zum Teil verhält es sich komisch... vor allem betreffend der Loops (z.B. ich rufe den break des main-loops auf, welcher auch beendet wird... aber dafür lande ich im manage_menu-loop ?!)
Auch erscheinen beim laden und speichern immer neue Errors... weshalb ich bei den exceptions, die gewählt werden sollen, wenn das File nicht existiert, nicht ganz sicher bin.
Naja, hier mal der neue Teil des Codes:
http://paste.pocoo.org/show/141345/
Das Programm ist nun so aufgebaut:
main:
----loop:
-------input(wahl)
-------load pb
-------save pb
-------change pb
-----------loop: (wahl wie bisher)
-------exit
Das Programm ist irgendwie launisch. Zum Teil funktioniert es so halb, zum Teil verhält es sich komisch... vor allem betreffend der Loops (z.B. ich rufe den break des main-loops auf, welcher auch beendet wird... aber dafür lande ich im manage_menu-loop ?!)
Auch erscheinen beim laden und speichern immer neue Errors... weshalb ich bei den exceptions, die gewählt werden sollen, wenn das File nicht existiert, nicht ganz sicher bin.
Naja, hier mal der neue Teil des Codes:
http://paste.pocoo.org/show/141345/
Das ist kein komisches Verhalten. Immerhin rufst du in Zeile 38 erneut die main-Funktion auf, du hast die Rekursion also nur sehr gut versteckt. Wie schon einmal gesagt: Parameter und Rückgabewerte. Erwähnte ich eigentlich Parameter und Rückgabewerte?
Das Leben ist wie ein Tennisball.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Nein, nein, nein!
Wieso nutzt Du nicht meine Vorgaben für das Laden und Speichern? So fängst Du beim Speichern genau gar keine Exceptions ab...
Und man sollte das with-Statement beim öffnen von Dateien benutzen - wieso "wehrst" Du Dich dagegen? Ich habe Dir das alles schon mal gezeigt!
Ich vermute das ganze geht schief wegen div. Rekursionen ohne Rücksprung!
Wieso machst Du es Dir denn so schwer?
Nach dem Start landet man in dem main-loop, in dem man Kommandos absetzen kann. Nach jeder Operation wird dahin zurückgesprungen!
Wozu dieses verschachtelte (was eben zu einer Rekursion führen dürfte!).
Hier mal ein logischer Aufbau:
Wieso nutzt Du nicht meine Vorgaben für das Laden und Speichern? So fängst Du beim Speichern genau gar keine Exceptions ab...
Und man sollte das with-Statement beim öffnen von Dateien benutzen - wieso "wehrst" Du Dich dagegen? Ich habe Dir das alles schon mal gezeigt!
Ich vermute das ganze geht schief wegen div. Rekursionen ohne Rücksprung!
Wieso machst Du es Dir denn so schwer?
Nach dem Start landet man in dem main-loop, in dem man Kommandos absetzen kann. Nach jeder Operation wird dahin zurückgesprungen!
Wozu dieses verschachtelte (was eben zu einer Rekursion führen dürfte!).
Hier mal ein logischer Aufbau:
Code: Alles auswählen
import sys
def load(filename="was auch immer"):
# hier dann das Laden
# das initialisierte dict zurückgeben
return pb
def dump(pb):
# hier das Speichern
def foo(pb):
print "Hier passsiert was mit pb", pb
def bar(pb):
print "Hier was anderes...", pb
def manage_menu(pb):
mapping = {
# wie gehabt
}
while True:
cmd = raw_input("Command:")
# mit "q" kommt man hier raus
if cmd == "q":
return
try:
mapping[cmd](pb)
except KeyError, e:
print "Ungültiges Kommando"
def main():
# von mir aus zu Beginn mal gleich was laden
# z.B. Parameter 1 aus der Kommandozeile
pb = load(sys.argv[1]) or {}
# dict an den main_loop
manage_menu(pb)
# nach "q" landet man hier und damit sauber am Ende
Weil ich aus irgendeinem Grund immer noch nicht sehe, inwiefern mein "try - except" damit los wird .Und man sollte das with-Statement beim öffnen von Dateien benutzen - wieso "wehrst" Du Dich dagegen?
Wenn ich load() aufrufe (mal egal von wo), dann soll es phonebook.data öffnen, oder, wenn dieses nicht existiert, eine Datei erstellen, die phonebook.data heisst.
Und 'with open('phonebook.data') as f:' gibt mir ja einen IOError, wenn ich nach einer Datei suche, die nicht existiert... also genauso, wie wenn ich es mit f = open('phonebook.data').
Oder mache ich was grundsätzlich falsch? =/
Test mit "with... as..." mit phonebookfile, das nicht existiert:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\Programmieren\Test.py", line 1, in <module>
with open('phonebook.data') as f:
IOError: [Errno 2] No such file or directory: 'phonebook.data'
####Deshalb hatte ich ein except IOError eingefügt, das eine Datei erstellt, wenn sie nicht existiert
Code: Alles auswählen
def pb_load(f = 'phonebook.data'):
with open('phonebook.data') as f:
pb = pickle.load(f)
return pb
def pb_save(pb):
with open('phonebook.data', "w") as f:
pickle.dump(pb, f)
f.close()
Die neue Umstrukturierung von manage_menu ist super, danke.
Habe auch ein paar Ausgabeänderungen unternommen, aber ich poste die Version dann mal, wenn ich das mit dem "with open(---) as --:" verstanden hab.
Ja, hast du =). Ich hab mich auch eingelesen, auch wenns an der Anwendung noch ein bisschen klemmt. Aber mein Fehler war, dass ich nach dem "break" im main() das "False" vergessen hatte, weshalb ich einfach wieder im Loop drin war. Weshalb ich mich dann gleich im manage_menu() wiederfand, ist mir noch unklar, aber das ist jetzt nicht so wichtig =).Immerhin rufst du in Zeile 38 erneut die main-Funktion auf, du hast die Rekursion also nur sehr gut versteckt. Wie schon einmal gesagt: Parameter und Rückgabewerte. Erwähnte ich eigentlich Parameter und Rückgabewerte?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wirst Du auch nicht - aber das finally! Du musst nur noch den möglichen IOError abfangen, wenn die Datei nicht gefunden wird oder sonst wie nicht geöffnet werden kann. Es geht darum, dass das with automatisch sicher stellt, dass keine geöffneten Datein "zurückbleiben".Seeker hat geschrieben:Weil ich aus irgendeinem Grund immer noch nicht sehe, inwiefern mein "try - except" damit los wird .Und man sollte das with-Statement beim öffnen von Dateien benutzen - wieso "wehrst" Du Dich dagegen?
Code: Alles auswählen
try:
with open()...
except IOError, e:
# was auch immer dann
else:
# wenn man mit den daten noch mehr machen will
Nein!!! Eine Funktion load() wird niemals eine Datei erstellen! Wozu auch? Es spielt doch später keine Rolle mehr, ob die existiert! Wenn Du zum Speichern kommst, wird doch sowieso eine neue Datei angelegt. Wenn Du also nichts laden konntest, startest Du eben mit einem leeren Dictionary... (Du kannst Dir z.B. überlegen, bei einem IOError eben ein leeres dict zurückzugeben)Wenn ich load() aufrufe (mal egal von wo), dann soll es phonebook.data öffnen, oder, wenn dieses nicht existiert, eine Datei erstellen, die phonebook.data heisst.
Danke für die schnelle Antwort =).
Dann hatte ich dich missverstanden, deshalb die Verwirrung.Wirst Du auch nicht - aber das finally! Du musst nur noch den möglichen IOError abfangen, wenn die Datei nicht gefunden wird oder sonst wie nicht geöffnet werden kann. Es geht darum, dass das with automatisch sicher stellt, dass keine geöffneten Datein "zurückbleiben".
Stimmt, macht eigentlich wenig Sinn. hm... ich glaube, ich werde einfach beim Start von main() gleich ein leeres dict einführen, welches ggf. durch load() durch ein gespeichertes ersetzt wird.Nein!!! Eine Funktion load() wird niemals eine Datei erstellen! Wozu auch? Es spielt doch später keine Rolle mehr, ob die existiert! Wenn Du zum Speichern kommst, wird doch sowieso eine neue Datei angelegt. Wenn Du also nichts laden konntest, startest Du eben mit einem leeren Dictionary... (Du kannst Dir z.B. überlegen, bei einem IOError eben ein leeres dict zurückzugeben)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Oder soSeeker hat geschrieben: Stimmt, macht eigentlich wenig Sinn. hm... ich glaube, ich werde einfach beim Start von main() gleich ein leeres dict einführen, welches ggf. durch load() durch ein gespeichertes ersetzt wird.
So, jetzt hab ichs schon fast . In dieser Form funktionierts:
http://paste.pocoo.org/show/141435/
Deine Idee mit dem pb = pb_load(sys.argv[1]) fand ich gut, da man so ein Phonebook laden kann, das nicht unter phonebook.data gespeichert ist.
Allerdings kommt immer die Meldung:
Müsste ich da wieder ein if-Statement benutzen? Oder gibt es einen eleganteren Weg?
Dann das letzte Detail:
Ich habe nun (fast) meine gewünschte Ausgabe erreicht:
Partial Code:
Ich verstehe nicht ganz weshalb das "\n" nicht funktioniert... kann es sein, dass ein string in einem dict() als rawstring behandelt wird?
http://paste.pocoo.org/show/141435/
Deine Idee mit dem pb = pb_load(sys.argv[1]) fand ich gut, da man so ein Phonebook laden kann, das nicht unter phonebook.data gespeichert ist.
Allerdings kommt immer die Meldung:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\Programmieren\Phonebook3c.py", line 100, in <module>
main()
File "C:\Python26\Lib\site-packages\Programmieren\Phonebook3c.py", line 84, in main
pb = pb_load(sys.argv[1]) or {}
IndexError: list index out of range
Dann das letzte Detail:
Ich habe nun (fast) meine gewünschte Ausgabe erreicht:
Partial Code:
Code: Alles auswählen
Name: Adrian Smith
Tel. Number: 056 234 87 45
Mob. Number: 097 345 23 54
Occupation: Testsubject
Address: Upper left corner\n47538 Your Backyard
Email: thecakeisalie@portal.com
*********************************************
Hallo.
Zu dem Indexfehler: Es wird erst versucht auf den Index 1 zuzugreifen, was natürlich nicht funktioniert. Das wirft dann eine Exception, der Rest wird nicht mehr ausgewertet. Du musst also vorher testen, ob der Index vorhanden ist.
Das "or" benutzt du übrigens sematisch falsch. Es tut zwar das, was es auch tun soll, aber ein if/else passt besser.
Zur Ausgabe: Bei der Adressanfrage gibtst du doch sicher "Upper left corner\n47538 Your Backyard" ein und bestätigst mit Enter. Dort wird natürlich das "\n" sofort intern in ein "\\n" umgewandelt, da du das Zeichen "\" eingegeben hast. Ein newline erhältst du, wenn du Enter drückst.
Entweder musst du die Adressteile einzeln Abfragen oder du behandelst eine Adresse gesondert, indem du Beispielsweise ein Semikolon als Trennzeichen verwendest und dann daran aufteilst.
Zu dem Indexfehler: Es wird erst versucht auf den Index 1 zuzugreifen, was natürlich nicht funktioniert. Das wirft dann eine Exception, der Rest wird nicht mehr ausgewertet. Du musst also vorher testen, ob der Index vorhanden ist.
Code: Alles auswählen
try:
pb = pb_load_(sys.argv[1])
except IndexError:
pb = {}
Zur Ausgabe: Bei der Adressanfrage gibtst du doch sicher "Upper left corner\n47538 Your Backyard" ein und bestätigst mit Enter. Dort wird natürlich das "\n" sofort intern in ein "\\n" umgewandelt, da du das Zeichen "\" eingegeben hast. Ein newline erhältst du, wenn du Enter drückst.
Entweder musst du die Adressteile einzeln Abfragen oder du behandelst eine Adresse gesondert, indem du Beispielsweise ein Semikolon als Trennzeichen verwendest und dann daran aufteilst.
Das Leben ist wie ein Tennisball.
Alles klar =).
Vielen Dank für eure Hilfe/Geduld!
Nur ne letzte kleine Frage:
Ich hab gesehen, dass du oft z.b. "Sorry, Kommando '{0}' unbekannt".format(choice) benutzt hast, wo ich "Sorry, Kommand %s unbekannt" %(choice) genommen hätte.
Gibt es da einen Unterschied/vorzuziehende Version?
lg Seeker
Vielen Dank für eure Hilfe/Geduld!
Komischerweise war das eben nicht der Fall, als ich statt dem dict() noch eine Liste benutzte.Zur Ausgabe: Bei der Adressanfrage gibtst du doch sicher "Upper left corner\n47538 Your Backyard" ein und bestätigst mit Enter. Dort wird natürlich das "\n" sofort intern in ein "\\n" umgewandelt,
Nur ne letzte kleine Frage:
Ich hab gesehen, dass du oft z.b. "Sorry, Kommando '{0}' unbekannt".format(choice) benutzt hast, wo ich "Sorry, Kommand %s unbekannt" %(choice) genommen hätte.
Gibt es da einen Unterschied/vorzuziehende Version?
lg Seeker
Zuletzt geändert von Seeker am Freitag 25. September 2009, 21:44, insgesamt 1-mal geändert.
Hallo.
Der Wechsel von einer Liste auf ein Dictionary hat damit sicher nichts zu tun, da hast du sicher noch mehr geändert.
Zum String Formatting: Das steht alles in der Dokumentation
str.format und String Formatting.
Der Wechsel von einer Liste auf ein Dictionary hat damit sicher nichts zu tun, da hast du sicher noch mehr geändert.
Zum String Formatting: Das steht alles in der Dokumentation
str.format und String Formatting.
Das Leben ist wie ein Tennisball.
Wird wohl schon so sein... wurde alles mehrmals neu geschrieben (zu Recht).
Habe nun eine funktionierende (End)Version, wo dies auch gelöst ist:
Zugegeben, der Code-Aufwand für eine neue Zeile scheint etwas gross zu sein... und die Ausrichtung ist nicht gerade elegant. Die Idee fand ich aber noch gut... (war auch nicht von mir xD). Dieses Vorgehen ermöglicht es, Adressen von verschiedenen Längen einzutragen (2 Zeilen, 3 Zeilen), was z.T. von Nutzen sein kann.
http://paste.pocoo.org/show/141514/
lg Seeker
Habe nun eine funktionierende (End)Version, wo dies auch gelöst ist:
Zugegeben, der Code-Aufwand für eine neue Zeile scheint etwas gross zu sein... und die Ausrichtung ist nicht gerade elegant. Die Idee fand ich aber noch gut... (war auch nicht von mir xD). Dieses Vorgehen ermöglicht es, Adressen von verschiedenen Längen einzutragen (2 Zeilen, 3 Zeilen), was z.T. von Nutzen sein kann.
http://paste.pocoo.org/show/141514/
lg Seeker
Hallo.
Fallen dir die Gemeinsamkeiten in den Zeilen 39, 55/56 und 59 nicht auf? Hier schreit es geradezu nach Konstanten.
Zeilen 85 bis 88 würde man wieder mit einem try/except lösen.
Warum hast du 95 bis 102 nicht auch mit einem Dictionary gelöst?
Das "False" in 103 ist vollkommen überflüssig.
Zeilen 62 und 63 sind Unsinn. ein "else: pass" tut genau nichts.
Sehe ich es richtig, dass die Adresse einfach als Liste ausgegeben wird? Finde ich jetzt nicht besonders benutzerfreundlich.
Die Namen finde ich immer noch seltsam. Warum nennst du "e_address" nicht einfach "email" und "pb" nicht "phonebook"? Das "i" und "a" sind immer noch da.
Zeile 54 würde ich zwischen 56 und 57 packen, das "order" würde ich aus der Funktion ziehen.
Aber im Großen und Ganzen sieht es wirklich schon sehr gut aus.
Fallen dir die Gemeinsamkeiten in den Zeilen 39, 55/56 und 59 nicht auf? Hier schreit es geradezu nach Konstanten.
Zeilen 85 bis 88 würde man wieder mit einem try/except lösen.
Warum hast du 95 bis 102 nicht auch mit einem Dictionary gelöst?
Das "False" in 103 ist vollkommen überflüssig.
Zeilen 62 und 63 sind Unsinn. ein "else: pass" tut genau nichts.
Sehe ich es richtig, dass die Adresse einfach als Liste ausgegeben wird? Finde ich jetzt nicht besonders benutzerfreundlich.
Die Namen finde ich immer noch seltsam. Warum nennst du "e_address" nicht einfach "email" und "pb" nicht "phonebook"? Das "i" und "a" sind immer noch da.
Zeile 54 würde ich zwischen 56 und 57 packen, das "order" würde ich aus der Funktion ziehen.
Aber im Großen und Ganzen sieht es wirklich schon sehr gut aus.
Das Leben ist wie ein Tennisball.