Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
talit:tutorial_oop3 [2025-05-19 20:05] – [Aufgabe D: Wie lange lernen?] hoftalit:tutorial_oop3 [2025-05-26 14:11] (aktuell) – [Aufgabe F] hof
Zeile 307: Zeile 307:
  
 Wie sieht die `ConsoleLearner.learn` Methode jetzt aus? Wie sieht die `ConsoleLearner.learn` Methode jetzt aus?
- +## Speichern & Lesen
-### Speichern & Lesen+
 Wir möchten `VocabularyUnits` in eine Datei speichern und von dort wieder lesen können. Es bietet sich an, eine Unit als JSON-Objekt zu speichern. JSON (JavaScript Object Notation) sind Dictionaries, die als Keys nur Strings, als Werte ausschliesslich Strings, Zahlen, Boolean-Werte, Listen und wiederum JSON-Objekte enthalten. Ein `WordPair` könnte zum Beispiel so aussehen: Wir möchten `VocabularyUnits` in eine Datei speichern und von dort wieder lesen können. Es bietet sich an, eine Unit als JSON-Objekt zu speichern. JSON (JavaScript Object Notation) sind Dictionaries, die als Keys nur Strings, als Werte ausschliesslich Strings, Zahlen, Boolean-Werte, Listen und wiederum JSON-Objekte enthalten. Ein `WordPair` könnte zum Beispiel so aussehen:
  
Zeile 315: Zeile 314:
 </code> </code>
  
-#### Aufgabe E: JSON-Serialisierung+Eine ganze Unit wäre dann eine Liste solcher Objekte: 
 + 
 +<code python> 
 +
 +  { 
 +    "word1": "Baum", 
 +    "word2": "tree", 
 +    "correct": 24, 
 +    "incorrect": 4, 
 +    "score": 0.9249845921993256 
 +  }, 
 +  { 
 +    "word1": "Blume", 
 +    "word2": "flower", 
 +    "correct": 30, 
 +    "incorrect": 14, 
 +    "score": 0.9999847523718017 
 +  } 
 +
 +</code> 
 +### Aufgabe E: JSON-Serialisierung
  
   * Füge eine Methode `to_dict(self)` zu `WordPair` hinzu, die ein Wort-Paar und seine Stats in ein Dictionary verwandelt und zurückgibt.   * Füge eine Methode `to_dict(self)` zu `WordPair` hinzu, die ein Wort-Paar und seine Stats in ein Dictionary verwandelt und zurückgibt.
Zeile 325: Zeile 344:
         import json         import json
         with open(filename, 'w') as out:         with open(filename, 'w') as out:
-            json.dump(json_list, out)+            json.dump(json_list, out, indent=2 # indent=2 aligns the output nicely
 </code> </code>
 +
 +
 +### Statische Methoden
 +Fürs Einlesen kommt die umgekehrte `json.load` Funktion zum Einsatz. Allerdings haben wir noch ein kleines Problem: Eine VocabularyUnit existiert ja noch gar nicht, wenn wir sie einlesen wollen aus der Datei. Wir benötigen also eine Funktion, die nicht an eine bestimmte Unit gebunden ist. Diese werden mit `@staticmethod` annotiert und haben keinen `self` Parameter. Statische Funktionen werden direkt über den Klassennamen aufgerufen.
 +
 +<code python>
 +class WordPair:
 +    ...
 +    
 +    @staticmethod
 +    def from_dict(data):
 +        """Creates a fresh word pair from json data."""
 +        pair = WordPair(data['word1'], data['word2'])
 +        # TODO also read stats if available
 +
 +
 +class VocabularyUnit:
 +    ...
 +    
 +    @staticmethod
 +    def read_from(filename):
 +        """Reads a vocabulary unit from a file."""
 +        import json
 +        pairs = []
 +        with open(filename, 'r') as infile:
 +            json_pairs = json.load(infile)
 +            pairs = [WordPair.from_dict(p) for p in json_pairs]
 +            return VocabularyUnit(pairs)
 +</code>
 +### Aufgabe F
 +Füge statische Methoden zu `VocabularyUnit` und `WordPair` hinzu, um die gespeicherten Daten wieder einlesen zu können.
 +
 +Ein Beispielprogramm für unseren Code könnte nun so aussehen:
 +
 +<code python>
 +from voci import *
 +
 +filename = 'data/test.voci'
 +unit = VocabularyUnit.read_from(filename)
 +
 +learner = ConsoleLearner()
 +try:
 +    learner.learn(unit)
 +    unit.print_stats()
 +finally:   # Code im finally-Block wird jedenfalls ausgeführt, auch wenn eine Exception passiert ist.
 +    unit.save_to(filename)
 +</code>
 +
 +
 +### Aufgabe G - Webapp
 +S. auch [[talit:flask_webserver]] und [[ef_informatik:webapps:start]].
  • talit/tutorial_oop3.1747685109.txt.gz
  • Zuletzt geändert: 2025-05-19 20:05
  • von hof