Schule,Informatikprojekt

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.
Antworten
LuMey
User
Beiträge: 1
Registriert: Sonntag 13. Dezember 2015, 18:28

Hallo Liebe Pyhton Community
Wir sollen von der Schule aus ein Projekt erstellen was sowas wie eine Nachhilfe vermittlung ist.Der einzige unterschied ist das wir es nicht online machen sondern manuel

Code: Alles auswählen

def vergleich(self):
        zaehler=0
        laenge=1
        try:
            FL=open(FILENAME2,"rb")
            self.lehrer=liste.Liste
            self.lehrer.laden(FL)
        except:
            pass
        for lehrkraft in self.lehrer:
            if self.en_fach.get==lehrkraft.holeFach():
                zaehler=zaehler+1
            if self.en_status.get==lehrkraft.status.get:
                zaehler=zaehler+1
            if self.en_wunschGeschlecht.get==self.lehrkraft.geschlecht.get:
                zaehler=zaehler+1
            if self.en_kostenspanne.get==self.lehrkraft.honorar.get:
                zaehler=zaehler+1
            if zaehler==4:
                try:
                    f=open(FILENAME3,"wb")
                except:
                    return 0
                try:
                    f.write(str(lehrkraft.holeName)+"/n")
                    f.write(str(lehrkraft.holeVorname)+"/n")
                    f.write(str(lehrkraft.holeHonoror)+"/n")
                    if lehrkraft.holeArt()=="TelNr":
                        f.write(str(lehrkraft.holeTelNr)+"/n")
                    if lehrkraft.holeArt()=="Email":
                        f.write(str(lehrkraft.holeEmail)+"/n")
                    if lehrkraft.holeArt()=="Post":
                        f.write(str(lehrkraft.holeStr)+"/n")
                    f.close()
                    return 1
                except:
                    return 0
das ist unser Quelltext für den Vergleich. nun gibts er uns immer einen AttributError bei for lehrkraft in self.lehrer ... AtrributError:self.lehrer

hat jemand eine Idee oder braucht ihr noch mehr Quelltext
Zuletzt geändert von Anonymous am Sonntag 13. Dezember 2015, 19:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@LuMey: jetzt fängt für Dich die Fehlersuche an. Diese Arbeit kannst Du Dir vereinfachen, wenn Du alle unsinnigen excepts löschst, denn die verhindern, dass Du irgendeinen Fehler finden kannst. Das nächste ist, dass eine Funktion möglichst kurz und nur eine Aufgabe hat, also das genaue Gegenteil Deiner Funktion. Teile die Funktion in kleine Einheiten auf, die Du einzeln testen kannst, um zu prüfen, dass sie auch das macht, was Du Dir gedacht hast. Dann kommst Du vielleicht auch drauf, warum lehrer kein Attribut von self ist.
BlackJack

@LuMey: Ich glaube davon möchte ich nicht noch mehr sehen. Das ist im grunde alles für die Tonne und sollte noch mal ordentlich neu geschrieben werden. Ich wüsste gar nicht wo ich da mit der Kritik anfangen sollte, da ist im Grunde jede Zeile zu bemängeln, viele vom Programmierstil her aber auch etliche echte Fehler wegen denen dieser Code nicht das tut was er sollte, also über den Fehler an es jetzt gerade hängt mal hinaus.

Der konkrete Fehler an dem Du gerade hängst ist das `self.lehrer` nicht definiert wurde. Was gar nicht sein sollte weil nach der `__init__()` alle Attribute existieren sollten die den Zustand eines Objekts ausmachen. Man führt nicht erst später neue Attribute ein. Nach der `__init__()` muss ein Objekt in einem benutzbaren Zustand sein.

In der Methode selbst wird `self.lehrer` genau dann nicht definiert wenn das Lesen der Datei nicht funktioniert weil da irgendwo eine Ausnahme ausgelöst wird. Womit wir beim nächsten echten Programmierfehler sind: Ausnahmebehandlung für alle Ausnahmen die aus ignorieren besteht. Manchmal kann ignorieren für ausgewählte, konkrete Ausnahmen eine sinnvolle Behandlung sein, hier wäre es das aber in keinem Fall sinnvoll weil danach ja einfach versucht wird auf `self.lehrer` zuzugreifen obwohl bei der Ausnahme ja schon klar sein musste das da irgendwas nicht mit stimmt.

Womit wir beim nächsten Punkt bei der Fehlerbehandlung sind: Du gibst da 0 oder 1 zurück, was irgendwie den Erfolg oder Misserfolg an den Aufrufer meldet. Aber *warum* und *was* nicht funktioniert hat, erfährt der nicht. Würde er aber wenn Du die Ausnahmen nicht so sinnlos behandeln würdest. Ausnahemen wurden eingeführt um spezielle Fehlerrückgabewerte loszuwerden, und Du machst diesen Fortschritt hier wieder rückgängig. Lass das sein! Wenn der Aufrufer etwas spezielles machen will wenn die Methode nicht erfolgreich war, dann kann *er* die Ausnahme behandeln. (Nebenei gibt es die Werte `True` und `False` wenn man Wahrheitswerte braucht, da sollte man nicht 1 und 0 für missbrauchen, denn dann fragt sich der Leser ob es irgendwo auch ein ``return 2`` geben könnte.)

Und wenn niemand die Ausnahme behandelt, dann bekommt man wenigstens mit was nicht funktioniert hat und *wo* im Quelltext das war. Also genau das was Du jetzt gerade wissen möchtest, durch die falsche Ausnahmebehandlung aber unterdrückst.

Schau Dir zur Namensschreibweise und zur Quelltextformatierung (und auch anderen Hinweisen) mal den Style Guide for Python Code an.

Die Methode hat eine unerwartete API. Keiner erwartet bei einer Methode die `vergleich()` heisst (und eher `vergleiche()` heissen sollte, weil Funktion und Methoden Tätigkeiten darstellen), dass sie aus Dateien liest und eine neue Datei schreibt. Das sollte man alles trennen, also das lesen, das verarbeiten, und das schreiben der Daten. Dann ist man flexibler darin woher die Daten kommen und wohin sie gehen. Man könnte beispielsweise alternativ auch die in Frage kommenden Lehrer auch in einer Datenbank ablegen, oder feste Daten für Tests direkt in den Quelltext schreiben.

Last but not least: Warum ist `lehrer` überhaupt ein Attribut des Objekts? Das hat da IMHO nichts zu suchen.
Antworten