Kleines Adressbuch

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
SynTech
User
Beiträge: 4
Registriert: Sonntag 1. April 2007, 21:39

Hallo zusammen!
Ich beschäftige mich erst seit Kurzem mit Python (ich hatte bereits - wenn auch eher schlechte - Vorkenntnisse in Delphi).
Ich habe "A Byte of Python" durchgelesen und nun zur Übung dieses Adressbuch geschrieben:

Code: Alles auswählen

#!/usr/bin/Python
# -*- coding: cp1252 -*-


import pickle


class Adressbuch:
    daten = {}
    # Falls nicht vorhanden, wird "adressbook.data"
    # erstellt. Ansonsten wird der Inhalt der Datei
    # geladen.
    try:
        f = file('adressbook.data')
        daten = pickle.load(f)
        f.close()
    except IOError:
        f = file('adressbook.data', 'w')
        f.close()
    except:
        pass 
    def __init__(self, datenliste):
        self.datenliste = datenliste
    def eintragen(self):
        """Erstellt einen neuen Eintrag im Adressbuch."""
        self.datenliste.append(raw_input('Geben Sie den Namen der Person ein:\n'))
        self.datenliste.append(raw_input('Geben Sie die Adresse ein:\n'))
        self.datenliste[1] = 'Adresse: ' + self.datenliste[1]
        self.datenliste.append(raw_input('Geben Sie die Email-Adresse ein:\n'))
        self.datenliste[2] = 'Email-Adresse: ' + self.datenliste[2]
        self.datenliste.append(raw_input('Geben Sie die Telefonnummer ein:\n'))
        self.datenliste[3] = 'Telefonnummer: ' + self.datenliste[3]
        Adressbuch.daten[self.datenliste[0]] = self.datenliste[1:]
        schreiben = file('adressbook.data', 'w')
        pickle.dump(Adressbuch.daten, schreiben)
        schreiben.close()
    def auflisten(self):
        """Listet alle im Adressbuch enthaltenen Eintraege auf."""
        for a, b in Adressbuch.daten.items():
            print a
            for b in Adressbuch.daten[a]:
                print b
    def loeschen(self):
        """Loescht gegebenen Eintrag oder das gesamte Adressbuch."""
        try:
            eingabe = raw_input('Geben Sie den zu loeschenden Eintrag ein \
(um das gesamte Adressbuch zu leeren, geben Sie "--all" ein):\n')
            if eingabe == '--all':
                Adressbuch.daten = {}
                f = file('adressbook.data', 'w')
                pickle.dump(Adressbuch.daten, f)
                f.close()
                print '\nDas Adressbuch wurde geleert.\n'
            else:
                del Adressbuch.daten[eingabe]
                f = file('adressbook.data', 'w')
                pickle.dump(Adressbuch.daten, f)
                f.close()
                print '\nDer Eintrag wurde entfernt.\n'
        except:
            print 'Der Eintrag konnte nicht entfernt werden.\n'
    def suche(self):
        """Sucht nach gegebenem Eintrag; wird dieser nicht gefunden,

wird eine Fehlermeldung ausgegeben."""
        try:
            eingabe = raw_input('Geben Sie den zu suchenden Eintrag ein:\n')
            for a in Adressbuch.daten[eingabe]:
                print a
        except:
            print 'Der Eintrag wurde nicht gefunden.\n'


def main():
    while True:
        print 'Neuer Eintrag : --add\nAuflisten : --list\nEintrag loeschen \
: --del\nEintrag suchen : --search\nBeenden : --end\n'
        option = raw_input('Was moechten Sie tun?\n')
        if option == '--add':
            datenliste = Adressbuch([]).eintragen()
        elif option == '--list':
            Adressbuch('').auflisten()
        elif option == '--del':
            Adressbuch('').loeschen()
        elif option == '--search':
            Adressbuch('').suche()
        elif option == '--end':
            break


if __name__ == '__main__':
    main()
Was kann man da verbessern?

Ich werde jetzt mit "Python Ge-Packt" anfangen; dort wird Tkinter behandelt.
Ist Tkinter empfehlenswert (für den Einstieg) oder sollte ich mir eine andere GUI anschauen?

MfG,
SynTech

edit:
-Änderungen am Code vorgenommen.
Zuletzt geändert von SynTech am Mittwoch 4. April 2007, 13:50, insgesamt 4-mal geändert.
uphill
User
Beiträge: 22
Registriert: Sonntag 10. Dezember 2006, 20:17

Hi erstmal,
Also werd mich mal wichtig machen *g*.

Also den PEP08 befolgst du brav. Bis auf dass deine Namen Deutsch sind und du noch dazu kein encoding angegeben hast ;).
Allerdings hast das ganze aus OOP sicht vielleicht nicht optimal gelößt. Ich hätte die Adressbuchklasse ein bischen mehgr gekapselt. So zum Beispiel die Eingaben nicht direkt abgefragt sondern zB ein dictionary in die function übergeben. Oder zB gehört meiner Meinung nach die Funktionen auflisten, loeschen und suchen in die Klasse Adressbuch.

lg
Julian
SynTech
User
Beiträge: 4
Registriert: Sonntag 1. April 2007, 21:39

Hi!
Ja, Du hast Recht, ich sollte das Ganze in Englisch schreiben. Encoding hab ich nur nicht mitkopiert. :lol:
Dass die Funktionen nicht in der Klasse sind, liegt daran, dass ich sie erst nachdem ich die "Grundstruktur" hatte, eingebaut habe; hab da etwas überstürzt gehandelt. :oops:

Gruß
SynTech
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo SynTech, willkommen im Forum,

Also, du solltest ``pickle`` nicht ``p`` nennen, denn p sagt genau - garnichts aus. Daher ist pickle eigentlich schon ein ausreichend kurzer Name. Dann würde ich noch eine Shebang und ein Encoding-Cookie hinzufügen. Außerdem noch eine main()-Funktion schreiben, die das while True beinahltet und dann mit dem __name__-Hack aufgerufen wird. Du kannst dur für das parsen der Kommandozeilenoptionen mal das Modul ``optparse`` ansehen. Das zusammensetzen der Informationen würde ich über printf-Formatierung machen - nein, eigentlich würde ich die Daten im Adressbuch anders schreiben und sie erst in der Ausgabe formatieren.

Dann würde ich noch die Daten nicht in die Klasse selbst speichern sondern in Klasseninstanzen - das finde ich wesentlich sauberer, wenn die einzelnen Instanzen von ``Adressbuch`` voneinander abgekapselt sind.

So, genauer habe ich es mir nicht angesehen, aber das ist schon mal kein übler Anfang.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
SynTech
User
Beiträge: 4
Registriert: Sonntag 1. April 2007, 21:39

Ich habe den Code, wie von euch vorgeschlagen, geändert.

Ich werde jetzt mit "Python Ge-Packt" anfangen; dort wird Tkinter behandelt.
Ist Tkinter empfehlenswert (für den Einstieg) oder sollte ich mir eine andere GUI anschauen?

Gruß
SynTech
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

SynTech hat geschrieben:Ist Tkinter empfehlenswert (für den Einstieg) oder sollte ich mir eine andere GUI anschauen?
Hängt ab, was deine Anforderungen sind. Schau in die anderen GUI-Threads dort wurde sowas schon sehr genau diskutiert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
DaSch
User
Beiträge: 72
Registriert: Mittwoch 28. März 2007, 20:04
Kontaktdaten:

also zu GUI hab ich mir wx rausgepickt da gibts auch z.B. wxGlade dass einem viel Arbeit abnimmt und da kann man sich auch einiges vom Code dann abgucken. mit Tk hab ich mich persönlich noch nicht beschäftigt (war glaub ich einfach zu naheliegend) :D
SynTech
User
Beiträge: 4
Registriert: Sonntag 1. April 2007, 21:39

Ich habe mir ein paar Dinge zu wxPython angesehen und denke, dass ich damit auch anfangen werde (allerdings später, erst arbeite ich "Python Ge-Packt" durch).

Gruß
SynTech
Antworten