import json import time import logging from pathlib import Path from functools import wraps logger = logging.getLogger(__name__) def store_to_disk( results: list[dict], poi_type: str = "overpass", output_dir: Path = Path("."), ) -> Path: """ Speichert eine Liste von OSM-Elementen als JSON-Datei auf der Festplatte. Der Dateiname wird aus dem poi_type-Parameter abgeleitet: z.B. poi_type="bergbahn" → "bergbahn_results.json" Args: results (list[dict]): Liste von OSM-Elementen, wie sie die Overpass API unter "elements" zurückgibt. poi_type (str): Bezeichnung des POI-Typs. Bestimmt den Dateinamen. Standard: "overpass" output_dir (Path): Zielverzeichnis. Wird erstellt falls nicht vorhanden. Standard: aktuelles Verzeichnis. Returns: Path: Absoluter Pfad zur gespeicherten Datei. Raises: OSError: Wenn das Verzeichnis nicht erstellt oder die Datei nicht geschrieben werden kann (z.B. fehlende Schreibrechte). """ output_dir.mkdir(parents=True, exist_ok=True) output_path = output_dir / f"{poi_type}_results.json" with output_path.open("w", encoding="utf-8") as f: json.dump(results, f, indent=2, ensure_ascii=False) return output_path.resolve() def timer(func): """ Decorator der die Ausführungszeit einer Funktion misst und loggt. Verwendung: @timer def meine_funktion(): ... """ @wraps(func) # erhält __name__, __doc__ der originalen Funktion def wrapper(*args, **kwargs): start = time.perf_counter() result = func(*args, **kwargs) elapsed = time.perf_counter() - start logger.info(f"{func.__name__}() dauerte {round(elapsed, 2)} Sekunden\n\n") return result return wrapper # @wraps(func) — ohne diesen Decorator würde run_seriell.__name__ den Namen "wrapper" zurückgeben statt # "run_seriell", was den Log-Output unbrauchbar macht