Coverage for src/_griffe/agents/nodes/parameters.py: 100.00%

20 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-08-15 16:47 +0200

1# This module contains utilities for extracting information from parameter nodes. 

2 

3from __future__ import annotations 

4 

5import ast 

6from itertools import zip_longest 

7from typing import Iterable, List, Optional, Tuple, Union 

8 

9from _griffe.enumerations import ParameterKind 

10 

11ParametersType = List[Tuple[str, Optional[ast.AST], ParameterKind, Optional[Union[str, ast.AST]]]] 

12"""Type alias for the list of parameters of a function.""" 

13 

14 

15def get_parameters(node: ast.arguments) -> ParametersType: 

16 parameters: ParametersType = [] 

17 

18 # TODO: probably some optimizations to do here 

19 args_kinds_defaults: Iterable = reversed( 

20 ( 

21 *zip_longest( 

22 reversed( 

23 ( 

24 *zip_longest( 

25 node.posonlyargs, 

26 [], 

27 fillvalue=ParameterKind.positional_only, 

28 ), 

29 *zip_longest(node.args, [], fillvalue=ParameterKind.positional_or_keyword), 

30 ), 

31 ), 

32 reversed(node.defaults), 

33 fillvalue=None, 

34 ), 

35 ), 

36 ) 

37 arg: ast.arg 

38 kind: ParameterKind 

39 arg_default: ast.AST | None 

40 for (arg, kind), arg_default in args_kinds_defaults: 

41 parameters.append((arg.arg, arg.annotation, kind, arg_default)) 

42 

43 if node.vararg: 

44 parameters.append( 

45 ( 

46 node.vararg.arg, 

47 node.vararg.annotation, 

48 ParameterKind.var_positional, 

49 "()", 

50 ), 

51 ) 

52 

53 # TODO: probably some optimizations to do here 

54 kwargs_defaults: Iterable = reversed( 

55 ( 

56 *zip_longest( 

57 reversed(node.kwonlyargs), 

58 reversed(node.kw_defaults), 

59 fillvalue=None, 

60 ), 

61 ), 

62 ) 

63 kwarg: ast.arg 

64 kwarg_default: ast.AST | None 

65 for kwarg, kwarg_default in kwargs_defaults: 

66 parameters.append( 

67 (kwarg.arg, kwarg.annotation, ParameterKind.keyword_only, kwarg_default), 

68 ) 

69 

70 if node.kwarg: 

71 parameters.append( 

72 ( 

73 node.kwarg.arg, 

74 node.kwarg.annotation, 

75 ParameterKind.var_keyword, 

76 "{}", 

77 ), 

78 ) 

79 

80 return parameters