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

1"""Compatibility utilities for function signature inspection.""" 

2 

3import inspect 

4from dataclasses import dataclass, field 

5 

6 

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() 

13 

14 

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)