def require_keys(obj, keys: list[str], context: str = ""): if obj is None or not isinstance(obj, dict): raise KeyError(f"{context}: invalid_object") for k in keys: if k not in obj: raise KeyError(f"{context}: missing_key={k}") def get_dict(obj, key: str, context: str = "") -> dict: if obj is None or not isinstance(obj, dict): raise KeyError(f"{context}: invalid_object") if key not in obj or obj[key] is None: raise KeyError(f"{context}: missing_key={key}") val = obj[key] if not isinstance(val, dict): raise KeyError(f"{context}: invalid_dict_key={key}") return val def get_list(obj, key: str, context: str = "") -> list: if obj is None or not isinstance(obj, dict): raise KeyError(f"{context}: invalid_object") if key not in obj or obj[key] is None: raise KeyError(f"{context}: missing_key={key}") val = obj[key] if not isinstance(val, list): raise KeyError(f"{context}: invalid_list_key={key}") return val