@Xfd7887a: In `schnell_aufgabe_erstellen()` ist das `update()` ein wenig umständlich. Das ist nicht der offensichtliche Weg um einem Wörterbuch *ein* Schlüssel/Wert-Paar hinzuzufügen.
Gleiches gilt eigentlich auch für `neue_aufgabe()` und der Stelle an der der Rückgabewert verwendet wird.
Wie gesagt würde ich das Datum nicht in eine Zeichenkette umwandeln. Dann musst Du jedes mal wenn Du das verwendest wieder in ein `datetime.date`-Objekt umwandeln. Das ist umständlich und fehleranfällig.
`abkuerzung()` ist missverständlich benannt und der Docstring ist ebenfalls missverständlich bis falsch. Da werden nicht Fächer den Abkürzungen zugeordnet sondern umgekehrt. Das Wörterbuch ändert sich ja nicht, also könnte man das als Konstante ausserhalb der Funktion definieren. Die Abfrage geht mit der `dict.get()`-Methode auch viel einfacher.
Code: Alles auswählen
def abkuerzung_expandieren(fach):
"""Zuordnung der Abkuerzungen zu den Faecher"""
return ABKUERZUNG_ZU_FACH.get(fach, fach)
Warum gibt `datum_auswerten()` kein Datum sondern Datum + Zeit zurück wobei die Zeit *immer* 0 ist?
Das zweite Format ist nicht das „Amerikanische” sondern eher das internationale. Dafür gibt es nämlich eine ISO-Norm.
Man sollte nicht den gleichen Namen in der selben Funktion für unterschiedliche Dinge verwenden. Statt auf die Einzelteile des Datums per Index zuzugreifen hätte man sie auch an unterschiedliche Namen binden können. Das hätte den zusätzlichen Vorteil das die Zeile zum erstellen des Datumsobjekts nur *einmal* in der Funktion stehen müsste.
Funktionen sollten nicht ein übergebenes Objekt verändern *und* es als Rückgabewert haben. Die Veränderung ist beim Aufrufer sichtbar, und der Aufrufer muss das Objekt ja schon haben, sonst hätte er es nicht übergeben können. Also macht es keinen Sinn ein Objekt was er schon hat, noch mal als Rückgabwert zu bekommen.
`ausgabe_der_aufgaben()` sollte die Daten nur ausgeben und nicht auch nebenbei Datensätze verändern. Damit rechnet keiner.
Ein nacktes ``except`` ist keine gute Idee. Das behandelt tatsächlich *alle* Ausnahmen, also auch wenn man sich im ``try``-Block bei einem Namen vertippt hat. Solche Fehler sind dann oft sehr schwer zu finden.
Man sollte keine Daten immer wieder im Quelltext wiederholen. So etwas wie der Dateiname der Aufgabendatei sollte man als Konstante definieren oder als Argument übergeben (oder beides). Dann muss man das nur an *einer* Stelle im Programm ändern.
Wenn die Datei nicht geladen werden kann, dann verhält sich das Programm fehlerhaft. Denn `json.dump()` gibt `None` zurück, und nicht etwa die Datenstruktur. Selbst dann wäre der Code fehlerhaft denn Du speicherst da eine Zeichenkette mit geschweiften Klammern als Inhalt und nicht etwa ein leeres Wörterbuch was man an der Stelle eigentlich machen müsste/sollte. Oder man bindet dort einfach `aufgaben` an ein leeres Wörterbuch und lässt das schreiben in eine Datei an der Stelle bleiben.
Das `exit()` einfach so existiert ist eine Besonderheit von CPython. Die Funktion muss man streng genommen aus `sys` importieren. Ich wäre auch vorsichtig mit der Verwendung wenn es nicht zwingend sein muss.
Das die Dateien nicht wieder geschlossen werden würde ich als Programmfehler ansehen. Man verlässt sich da auf Implementierungsdetails und Dateihandles sind eine limitierte Systemressource.