2.4 KiB
2.4 KiB
Task 11 — Externe Konfiguration mit config.yaml
Rückblick Task 10: Queries auslagern
Ihr habt die Overpass-Queries in eigene .overpassql-Dateien verschoben und
load_query() in fetcher.py eingeführt. Die wichtigsten Punkte:
- Separation of Concerns: Die Query ist jetzt klar vom Python-Code getrennt.
Jemand kann eine neue Query schreiben, ohne
fetcher.pyanzufassen — und umgekehrt kannfetcher.pyverbessert werden, ohne die Queries zu kennen. Path(__file__).parent / "queries"ist robuster als"queries/", weil er immer relativ zur Datei selbst aufgelöst wird — unabhängig davon, aus welchem Verzeichnis das Skript gestartet wird.- Fehlender Query-File:
load_query()prüft explizit, ob die Datei existiert, und wirft eine sprechendeOverpassApiError. Ohne diese Prüfung käme ein generischerFileNotFoundError— schwerer zu debuggen. {timeout}und{maxsize}im Template: Statt Werte im Query-String hardzucoden, werden sie beim Laden eingefüllt. Das macht die Query flexibel und die Werte zentral steuerbar.
Aufgabe
In main.py stehen noch immer Konfigurationswerte direkt im Code:
BBOXEN = {
"davos": (46.72, 9.70, 46.92, 10.00),
"schweiz": (45.8, 5.9, 47.8, 10.5),
}
TIMEOUT = 25
MAXSIZE = 5000000
poi_type = PoiType.BERGBAHN
Wer eine neue Bbox hinzufügen oder einen anderen POI-Typ abfragen will, muss Python-Code editieren. Das ist unpraktisch — und fehleranfällig.
Konkret:
- Lege eine
config.yamlim Package-Ordner an mit folgender Struktur:
overpass:
timeout: 25
maxsize: 5000000
bboxen:
davos: [46.72, 9.70, 46.92, 10.00]
schweiz: [45.8, 5.9, 47.8, 10.5]
active_queries:
- bergbahn
- Installiere
PyYAMLfalls noch nicht vorhanden (pip install pyyaml). - Lese die Config in
main.pymityaml.safe_load()ein. - Ersetze alle hardcodierten Konstanten durch die Werte aus der Config.
- Erzeuge
poi_typesals Liste vonPoiType-Objekten ausactive_queriesund iteriere inmain()darüber. Damit können wir nachher nicht nur z.B. Restaurants fetchen, sondern zusätzlich auch andere POI-Typen.
Fragen zum Nachdenken:
- Welche Arten von Konfiguration gehören in eine YAML-Datei, welche eher
in Umgebungsvariablen (
.env)? - Was passiert, wenn jemand in
active_querieseinen ungültigen Wert einträgt (z.B."gondelbahn"), der nicht imPoiType-Enum existiert?