|
13 | 13 | # - incorrect number of args |
14 | 14 |
|
15 | 15 |
|
| 16 | +def _process_args_kwargs_mapping( |
| 17 | + func: Callable[..., Any], |
| 18 | + args: tuple, |
| 19 | + kwargs: dict, |
| 20 | + inputs: list[str], |
| 21 | + variables: dict[str, Any], |
| 22 | +) -> dict[str, Any]: |
| 23 | + sig = inspect.signature(func) |
| 24 | + mapping = {} |
| 25 | + |
| 26 | + for idx, (name, _param) in enumerate(sig.parameters.items()): |
| 27 | + mapping[name] = inputs[idx] |
| 28 | + |
| 29 | + for kwarg, kwarg_value in kwargs.items(): |
| 30 | + variables[mapping[kwarg]] = kwarg_value |
| 31 | + |
| 32 | + for idx, (arg_value) in enumerate(args): |
| 33 | + kwarg = inputs[idx] |
| 34 | + variables[kwarg] = arg_value |
| 35 | + |
| 36 | + return variables |
| 37 | + |
| 38 | + |
| 39 | +def _process_inputs( |
| 40 | + func: Callable[..., Any], |
| 41 | + inputs_decorated: Optional[list[str]], |
| 42 | + variables: dict[str, Any], |
| 43 | +) -> tuple[dict[str, Any], list[str]]: |
| 44 | + sig = inspect.signature(func) |
| 45 | + if inputs_decorated is None: |
| 46 | + inputs = [] |
| 47 | + for name, _param in sig.parameters.items(): |
| 48 | + inputs.append(name) |
| 49 | + variables[name] = ( |
| 50 | + _param.default |
| 51 | + if _param.default is not inspect.Parameter.empty |
| 52 | + else None |
| 53 | + ) |
| 54 | + else: |
| 55 | + if len(sig.parameters) != len(inputs_decorated): |
| 56 | + raise ValueError( |
| 57 | + f"Function {func.__name__} has {len(sig.parameters)} parameters, " |
| 58 | + f"but {len(inputs_decorated)} inputs were provided." |
| 59 | + ) |
| 60 | + return variables, inputs |
| 61 | + |
| 62 | + |
16 | 63 | def datalayer( |
17 | 64 | runtime_name: Union[Callable[..., Any], Optional[str]] = None, |
18 | 65 | inputs: Optional[list[str]] = None, |
@@ -65,37 +112,20 @@ def decorator(func: Callable[..., Any]) -> Callable[..., Any]: |
65 | 112 | if output_decorated is None: |
66 | 113 | output = f"DATALAYER_RUNTIME_OUTPUT_{func.__name__}".upper() |
67 | 114 |
|
68 | | - sig = inspect.signature(func) |
69 | | - if inputs_decorated is None: |
70 | | - inputs = [] |
71 | | - for name, _param in sig.parameters.items(): |
72 | | - inputs.append(name) |
73 | | - variables[name] = ( |
74 | | - _param.default |
75 | | - if _param.default is not inspect.Parameter.empty |
76 | | - else None |
77 | | - ) |
78 | | - else: |
79 | | - if len(sig.parameters) != len(inputs_decorated): |
80 | | - raise ValueError( |
81 | | - f"Function {func.__name__} has {len(sig.parameters)} parameters, " |
82 | | - f"but {len(inputs_decorated)} inputs were provided." |
83 | | - ) |
| 115 | + variables, inputs = _process_inputs( |
| 116 | + func=func, inputs_decorated=inputs_decorated, variables=variables |
| 117 | + ) |
84 | 118 |
|
85 | 119 | @functools.wraps(func) |
86 | 120 | def wrapper(*args: Any, **kwargs: Any) -> Any: |
87 | | - sig = inspect.signature(func) |
88 | | - mapping = {} |
89 | | - for idx, (name, _param) in enumerate(sig.parameters.items()): |
90 | | - mapping[name] = (inputs_decorated or inputs)[idx] |
91 | | - |
92 | | - for kwarg, kwarg_value in kwargs.items(): |
93 | | - variables[mapping[kwarg]] = kwarg_value |
94 | | - |
95 | | - for idx, (arg_value) in enumerate(args): |
96 | | - kwarg = (inputs_decorated or inputs)[idx] |
97 | | - variables[kwarg] = arg_value |
98 | | - |
| 121 | + # Process args and kwargs to map to inputs |
| 122 | + variables = _process_args_kwargs_mapping( |
| 123 | + func=func, |
| 124 | + args=args, |
| 125 | + kwargs=kwargs, |
| 126 | + inputs=(inputs_decorated or inputs), |
| 127 | + variables=variables, |
| 128 | + ) |
99 | 129 | function_call = ( |
100 | 130 | f"{output_decorated or output} = {func.__name__}(" |
101 | 131 | + ", ".join(inputs_decorated or inputs) |
|
0 commit comments