code: def adapts(**schemas):
      
      validate = parse(schemas).validate
  
      @decorator
      def adapting(func, *args, **kwargs):
          adapted = validate(inspect.getcallargs(func, *args, **kwargs), adapt=True)
          argspec = inspect.getargspec(func)
  
          if argspec.varargs is argspec.keywords is None:
              # optimization for the common no varargs, no keywords case
              return func(**adapted)
  
          adapted_varargs = adapted.pop(argspec.varargs, ())
          adapted_keywords = adapted.pop(argspec.keywords, {})
          if not adapted_varargs:  # keywords only
              if adapted_keywords:
                  adapted.update(adapted_keywords)
              return func(**adapted)
  
          adapted_posargs = [adapted[arg] for arg in argspec.args]
          adapted_posargs.extend(adapted_varargs)
          return func(*adapted_posargs, **adapted_keywords)
  
      return adapting
docs: Create a decorator for validating and adapting function parameters.
  
      Example::
  
          @adapts(a="number", body={"+field_ids": [V.AdaptTo(int)], "is_ok": bool})
          def f(a, body):
              print (a, body.field_ids, body.is_ok)
  
      :param schemas: The schema for adapting a given parameter.