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)
| 697 | |
| 698 | |
| 699 | def _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 |
no outgoing calls
no test coverage detected