Optimierung eines Telefonbuchs

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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"?
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Ja und da hast Du aber open() nicht gesagt, dass Du Lesen ("r") möchtest, sondern Schreiben ("w")!
2) Die Datei existiert nicht, dann wird sie geschrieben, geöffnet und ein leeres Dictionary wird erstellt.
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.

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!
Jetzt spezifisch:
Das mit dem Template habe ich schlussendlich so halbwegs hingekriegt, aber dispatch will einfach nicht klappen =/.
Sorry, war mein Fehler. Die Reihenfolge zwischen default und non-default-Argumenten spielt in Python natürlich eine Rolle:

Code: Alles auswählen

# richtig
def foo(bar, choice="f")
    pass

# falsch
def foo(choice="f", bar)
   pass
Also lass das default-Argument eben weg - man ruft dispatch ja eh mit einem Wert auf.

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)
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.
Wozu der Rückfall zu so einer schlechten Lösung?
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Danke für die Antworten =)!
In Zeile 8 öffnest du die Datei nur zum Lesen, dann kannst du in Zeile 17 nicht einfach etwas hineinschreiben.
Ja und da hast Du aber open() nicht gesagt, dass Du Lesen ("r") möchtest, sondern Schreiben ("w")!
:D ...aber ist mein Fehler.
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.
Sorry, war mein Fehler. Die Reihenfolge zwischen default und non-default-Argumenten spielt in Python natürlich eine Rolle
omg... das hätt ich eigentlich auch selber gewusst :/... habs ja x mal gelesen ^^. Irgendwie ... keine Ahnung, Wand vor den Augen ;).
Wozu der Rückfall zu so einer schlechten Lösung?
Das Telefonbuch funktioniert mittlerweilen super. Allerdings wollte ich eigentlich die Ausgabe so haben (so war die Ausgabe mit der Liste):

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
Aber es gibt sie mir so an:

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 
Neu:
http://paste.pocoo.org/show/141297/
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

ich hab mir den Code zwar nicht angeschaut, aber es dürfet an dem liegen:

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
die 3 Prints kann man auch z.B. mit

Code: Alles auswählen

abc = ['a', 'b', 'c']
for i in abc:
    print i
ersetzten

wenn meine Vermutung stimmt muss du hinter die Print-Anweisung eine Komma setzten

Code: Alles auswählen

print 'Hallo',
mfg[/code]
the more they change the more they stay the same
Benutzeravatar
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:

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()
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...
Benutzeravatar
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!

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
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Ich war Essen, hatte also noch keine Zeit mich ums öffnen/schliessen etc. zu kümmern.
Aber nur kurz zur Erklärung:
Wieso heißt das noch tell()
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 tragisch :roll:
# wieso person_info - das ist doch bei dir eine "person", also würd ichs auch so nennen
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.
# i ist mist! wieso nicht "person"?
Weil ich am Anfang für alle for ... in... jeweils i benutzt habe und erst nachträglich gewisse verändert habe.

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()
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

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/
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Benutzeravatar
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... :roll:

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
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Und man sollte das with-Statement beim öffnen von Dateien benutzen - wieso "wehrst" Du Dich dagegen?
Weil ich aus irgendeinem Grund immer noch nicht sehe, inwiefern mein "try - except" damit los wird :( .
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
Meine load und save Funktionen:

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()
Da ich meines Wissens nur im cmd argumente hinzufügen kann, dieses Programm aber meistens direkt ausführe, sollte der Name ('phonebook.data') wenn möglich als default drin sein.

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.
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?
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 =).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Seeker hat geschrieben:
Und man sollte das with-Statement beim öffnen von Dateien benutzen - wieso "wehrst" Du Dich dagegen?
Weil ich aus irgendeinem Grund immer noch nicht sehe, inwiefern mein "try - except" damit los wird :( .
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".

Code: Alles auswählen

try:
    with open()...
except IOError, e:
    # was auch immer dann
else:
    # wenn man mit den daten noch mehr machen will
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.
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)
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Danke für die schnelle Antwort =).
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".
Dann hatte ich dich missverstanden, deshalb die Verwirrung.
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)
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Seeker 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.
Oder so :-)
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

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:

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
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:

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
*********************************************
Ich verstehe nicht ganz weshalb das "\n" nicht funktioniert... kann es sein, dass ein string in einem dict() als rawstring behandelt wird?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.

Code: Alles auswählen

try:
    pb = pb_load_(sys.argv[1])
except IndexError:
    pb = {}
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.
Das Leben ist wie ein Tennisball.
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Alles klar =).
Vielen Dank für eure Hilfe/Geduld! :D
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,
Komischerweise war das eben nicht der Fall, als ich statt dem dict() noch eine Liste benutzte.

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Antworten