from types import FunctionType def ensure_annotation_class(f: FunctionType): def wrapper(*args, **kwargs): keys = tuple(f.__annotations__.keys()) args_converted = () for ar in enumerate(args): expected_class = f.__annotations__.get(keys[ar[0]]) if not isinstance(ar[1], expected_class): args_converted += (expected_class(ar[1]),) else: args_converted += (ar[1],) kwargs_ensured_class = {} for k, v in kwargs.items(): expected_class = f.__annotations__.get(k) if not isinstance(v, expected_class): v = expected_class(v) kwargs_ensured_class[k] = v return f(*args_converted, **kwargs_ensured_class) return wrapper