MCPcopy
hub / github.com/google/python-fire / _MakeParseFn

Function _MakeParseFn

fire/core.py:699–754  ·  view source on GitHub ↗

Creates a parse function for fn. Args: fn: The function or class to create the parse function for. metadata: Additional metadata about the component the parse function is for. Returns: A parse function for fn. The parse function accepts a list of arguments and returns (varargs,

(fn, metadata)

Source from the content-addressed store, hash-verified

697
698
699def _MakeParseFn(fn, metadata):
700 """Creates a parse function for fn.
701
702 Args:
703 fn: The function or class to create the parse function for.
704 metadata: Additional metadata about the component the parse function is for.
705 Returns:
706 A parse function for fn. The parse function accepts a list of arguments
707 and returns (varargs, kwargs), remaining_args. The original function fn
708 can then be called with fn(*varargs, **kwargs). The remaining_args are
709 the leftover args from the arguments to the parse function.
710 """
711 fn_spec = inspectutils.GetFullArgSpec(fn)
712
713 # Note: num_required_args is the number of positional arguments without
714 # default values. All of these arguments are required.
715 num_required_args = len(fn_spec.args) - len(fn_spec.defaults)
716 required_kwonly = set(fn_spec.kwonlyargs) - set(fn_spec.kwonlydefaults)
717
718 def _ParseFn(args):
719 """Parses the list of `args` into (varargs, kwargs), remaining_args."""
720 kwargs, remaining_kwargs, remaining_args = _ParseKeywordArgs(args, fn_spec)
721
722 # Note: _ParseArgs modifies kwargs.
723 parsed_args, kwargs, remaining_args, capacity = _ParseArgs(
724 fn_spec.args, fn_spec.defaults, num_required_args, kwargs,
725 remaining_args, metadata)
726
727 if fn_spec.varargs or fn_spec.varkw:
728 # If we're allowed *varargs or **kwargs, there's always capacity.
729 capacity = True
730
731 extra_kw = set(kwargs) - set(fn_spec.kwonlyargs)
732 if fn_spec.varkw is None and extra_kw:
733 raise FireError('Unexpected kwargs present:', extra_kw)
734
735 missing_kwonly = set(required_kwonly) - set(kwargs)
736 if missing_kwonly:
737 raise FireError('Missing required flags:', missing_kwonly)
738
739 # If we accept *varargs, then use all remaining arguments for *varargs.
740 if fn_spec.varargs is not None:
741 varargs, remaining_args = remaining_args, []
742 else:
743 varargs = []
744
745 for index, value in enumerate(varargs):
746 varargs[index] = _ParseValue(value, None, None, metadata)
747
748 varargs = parsed_args + varargs
749 remaining_args += remaining_kwargs
750
751 consumed_args = args[:len(args) - len(remaining_args)]
752 return (varargs, kwargs), consumed_args, remaining_args, capacity
753
754 return _ParseFn
755
756

Callers 1

_CallAndUpdateTraceFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected