Der Quelltext enhält Zeichen ausserhalb des ASCII-Zeichensatzes aber keinen "Kodierungskommentar". Es gibt eine Menge Zeilen die länger als 80 Zeichen sind. Leerzeichen vor und nach Operatoren und nach Kommata wären nett. Leerzeilen zwischen Funktions-/Methodendefinitionen fördern auch die Lesbarkeit.
Kommentare wie ``#der Import`` direkt vor den Importen sind überflüssig. Kommentare die etwas erklären was nicht so offensichtlich ist, wären wichtiger. Was zum Henker macht `conpruef()`? Ebenso sind aussagekräftige Namen wichtig. `pruf`, `ok`, `ol`, `of`, `con` und `bloerb` (Bitte!?) sind das nicht unbedingt. Fast noch schlimmer sind Namen die nicht stimmen wie `letter`, der nicht an einen Brief oder Buchstaben gebunden wird, sondern an eine Liste mit Zeichenketten, wobei die teilweise länger als ein Zeichen sind.
Leerzeichen am Ende einer Zeichenkette entfernt man mit `rstrip()`. Ein Element an eine Liste anhängen geht mit der `append()`-Methode. Mit ``+`` eine Liste anzuhängen, die nur aus einem Element besteht, erzeugt eine neue Liste!
Was in der ``while``-Schleife passiert ist mir echt zu komplex um es ohne Kommentare nachzuvollziehen.
Du benutzt das `pickle`-Modul zu umständlich. In dem Modul gibt es Funktionen zum laden und speichern, es ist also nicht nötig `Pickler` und `UnPickler` selber zu erzeugen. Die Dateien sollten unbedingt im Binärmodus geöffnet werden, sonst sind sie nicht portabel. Und der Name `pickel` regt zum Schmunzeln an.
Bei Ausnahmebehandlungen sollten immer konkrete Ausnahmen bei ``except`` angegeben werden, sonst wird dort einfach jede Ausnahme behandelt, auch wenn man zum Beispiel einen Namen falsch geschrieben hat. Solche Fehler sind dann schwer zu finden.
Ich lese oft `i['irgenswas']` und `k['irgenswas']` und weiss nicht wo's herkommt und was es bedeutet.
Quelltext und HTML gehört getrennt. Dafür gibt es Template-Systeme.
Code sollte sich nicht wiederholen. Es wird an mehreren Stellen eine Überprüfung gemacht ob der Benutzer etwas darf. Das löst man besser irgendwo zentral, sonst muss man das an mehreren Stellen im Quelltext bearbeiten, wenn man dort etwas ändern möchte. Was immer mit der Gefahr verbunden ist, dass man eine Stelle vergisst oder nicht an allen Stellen exakt die gleichen Änderungen vornimmt. Das führt zu Fehlern, im Fall der Anmeldung vielleicht sogar zu einer Sicherheitslücke.
Warum ist `Inhalt.thrsort()` eine Methode und warum wird dort `Inhalt.save()` aufgerufen? Die "Methode" wird im Skript zum sortieren benutzt, was bedeutet, dass bei *jedem* Vergleich gespeichert wird!? Ausserdem kann man die drei ``if``-Anweisungen durch eine einfachen Aufruf der `cmp()`-Funktion ersetzen.
Falls Titel eindeutig sind, kann man die Schleife in `Inhalt.delete()` abbrechen sobald gelöscht wird. Falls der Titel nicht eindeutig ist, lauert dort ein Problem: Wenn man etwas aus einer Liste entfernt, werden alle folgenden Elemente einen Platz nach vorne kopiert, das verträgt sich nicht mit der Schleife.
Klassennamen werden per Konvention in CamelCase geschrieben und sollten auch aussagekräftig sein. Beides trifft auf `ul` nicht zu. Und warum ist hier plötzlich bei der Definition der Methoden ein Leerzeichen zwischen Methodenname und öffnender Klammer der Argumentliste?
`ul.liste()` ist mal wieder sehr umständlich. Über die Schlüssel zu iterieren um in der Schleife dann auf den Wert zuzugreifen ist viel zu indirekt. Wenn man etwas mit allen Werten machen will, kann man auch direkt über alle Werte iterieren. Letztendlich ist das eine einzelne "list comprehension".
Code: Alles auswählen
def liste(self):
return [item['nick'] for item in self.inhalt.itervalues()]
Insgesamt solltest Du Dir bei all diesen ``for``-Schleifen, die etwas in Listen suchen mal überlegen, ob das die richtige Datenstruktur ist, bzw. ob das Dictionary in `ul` den richtigen Index hat. Der Benutzername sollte doch wohl eindeutig sein, warum ist das nicht der Schlüssel des Dictionaries!?
Auf Modulebene sollten nur Klassen, Funktionen und Konstanten stehen, da müsste also noch so einiges in Funktionen verpackt werden.
Für "nichts" gibt es den Typ `None`. So wie's aussieht kann es keinen Benutzer mit dem Namen "nichts" oder das Passwort "nichts" geben. Das ist eine künstliche Einschränkung.
Ansonsten sehe ich noch massive Probleme beim schreiben der Dateien, das nicht gegen konkurrierende Schreib- und Lesezugriffe geschützt ist. Hier ist eigentlich eine Datenbank angesagt.