import re from typing import TypeVar, Callable, Dict, Any, cast T = TypeVar("T") _to_snake_case: Callable[[str], str] = lambda string: re.sub(r"(? T: if isinstance(data, list): return cast(T, [ _scheme(sub_data, adapter) for sub_data in data ]) elif isinstance(data, dict): return cast(T, { adapter(key): _scheme(value, adapter) for key, value in data.items() }) else: return data def to_snake_case_keys(dictionary: T) -> T: return _scheme(dictionary, _to_snake_case) def to_camel_case_keys(dictionary: T) -> T: return _scheme(dictionary, _to_camel_case)