code: def typecasted(func):
      
      signature = inspect.signature(func).parameters.items()
  
      @wraps(func)
      def wrapper(*args, **kwargs):
          args = list(args)
          new_args = []
          new_kwargs = {}
          for _, param in signature:
              converter = param.annotation
              if converter is inspect._empty:
                  converter = lambda a: a  # do nothing
              if param.kind is param.POSITIONAL_OR_KEYWORD:
                  if args:
                      to_conv = args.pop(0)
                      new_args.append(converter(to_conv))
              elif param.kind is param.VAR_POSITIONAL:
                  for a in args:
                      new_args.append(converter(a))
              else:
                  for k, v in kwargs.items():
                      nk, nv = converter(k, v)
                      new_kwargs[nk] = nv
          return func(*new_args, **new_kwargs)
      return wrapper
docs: Decorator that converts arguments via annotations.