code: def call_with_asked_args(callback, args):
      
      # FIXME: support default args
      # FIXME: support kwargs
      # co_varnames contains both args and local variables, in order. 
      # We only pick the local variables
      asked_arg_names = callback.__code__.co_varnames[:callback.__code__.co_argcount]
      asked_arg_values = []
      missing_args = []
      for asked_arg_name in asked_arg_names:
          if asked_arg_name in args:
              asked_arg_values.append(args[asked_arg_name])
          else:
              missing_args.append(asked_arg_name)
      if missing_args:
          raise TypeError(
              '{}() missing required positional argument: {}'.format(
                  callback.__code__.co_name,
                  ', '.join(missing_args)
              )
          )
      return callback(*asked_arg_values)
docs: Call callback with only the args it wants from args
  
      Example
      >>> def cb(a):
      ...    return a * 5
  
      >>> print(call_with_asked_args(cb, {'a': 4, 'b': 8}))
      20