from typing import Dict, Tuple, Callable CacheValues = Tuple[str, str, str] CacheValuesCallback = Callable[[], CacheValues] _cache: Dict[str, Dict[str, CacheValues]] = {} def save_entry(module_name: str, name: str, cache: CacheValues) -> None: try: module_cache = _cache[module_name] except KeyError: module_cache = _cache[module_name] = {} module_cache[name] = cache def _create_get_from_cache(number: int) -> Callable[[str, str, CacheValuesCallback], str]: def _get_from_cache(module_name: str, name: str, get_cache_values: CacheValuesCallback) -> str: try: return _cache[module_name][name][number] except KeyError: v = get_cache_values() save_entry(module_name, name, v) return v[number] return _get_from_cache get_type = _create_get_from_cache(0) get_docstring_signature = _create_get_from_cache(1) get_docstring = _create_get_from_cache(2)