# Task 8 — Python Package ## Rückblick Task 7: Logging Ihr habt alle `print()`-Aufrufe durch das `logging`-Modul ersetzt. Warum ist das besser? - **Log-Level steuern ohne Code-Änderung:** Mit `logging.basicConfig(level=logging.DEBUG)` sieht man alle Details, mit `level=logging.WARNING` nur Probleme — ohne eine einzige Zeile im Anwendungscode anzufassen. - **`logger = logging.getLogger(__name__)`:** Jedes Modul bekommt seinen eigenen Logger, benannt nach dem Modul. Im Output sieht man sofort, *woher* eine Meldung kommt. - **`logging.basicConfig()` gehört in `main.py`** (den Einstiegspunkt), nicht in Hilfmodule — sonst konfiguriert jedes importierte Modul eigenständig das Logging, was zu unvorhersehbarem Verhalten führt. - **Alternative:** Für grössere Projekte lohnt sich eine separate Logging-Konfiguration via `logging.config.dictConfig()` oder eine externe Library wie `loguru`. ## Aufgabe Das Projekt besteht aktuell aus losen Modulen (`main.py`, `models.py`, `overpass.py`). Ziel ist es, daraus ein sauberes Python-Package zu machen. **Konkret:** 1. Lege eine leere `__init__.py` im Projektordner an. 2. Benenne `overpass.py` in `fetcher.py` um (um später Namenskonflikte zu vermeiden). 3. Passe alle Imports in `main.py` und `fetcher.py` auf **relative Imports** um (`from .models import …` statt `from models import …`). **Fragen zum Nachdenken:** - Was ist der Unterschied zwischen einem Modul und einem Package in Python? - Was bewirkt `__init__.py` — was passiert ohne sie? - Wann verwendet man relative Imports, wann absolute? - Warum ist `from overpass import *` problematisch?