Coverage for src/loman/compat.py: 96%
26 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-21 05:36 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-21 05:36 +0000
1"""Compatibility utilities for function signature inspection."""
3import inspect
4from dataclasses import dataclass, field
7@dataclass
8class _Signature:
9 kwd_params: list[str] = field()
10 default_params: list[str] = field()
11 has_var_args: bool = field()
12 has_var_kwds: bool = field()
15def get_signature(func):
16 """Extract function signature information for compatibility purposes."""
17 sig = inspect.signature(func)
18 pk = inspect._ParameterKind
19 has_var_args = False
20 has_var_kwds = False
21 all_keyword_params = []
22 default_params = []
23 for param_name, param in sig.parameters.items():
24 if param.kind == pk.VAR_POSITIONAL:
25 has_var_args = True
26 elif param.kind == pk.VAR_KEYWORD:
27 has_var_kwds = True
28 elif param.kind in (pk.POSITIONAL_OR_KEYWORD, pk.KEYWORD_ONLY):
29 all_keyword_params.append(param_name)
30 if param.default != inspect._empty:
31 default_params.append(param_name)
32 else:
33 raise NotImplementedError(f"Unexpected param kind: {param.kind}")
34 return _Signature(all_keyword_params, default_params, has_var_args, has_var_kwds)