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
« 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.
3from __future__ import annotations
5import ast
6from itertools import zip_longest
7from typing import Iterable, List, Optional, Tuple, Union
9from _griffe.enumerations import ParameterKind
11ParametersType = List[Tuple[str, Optional[ast.AST], ParameterKind, Optional[Union[str, ast.AST]]]]
12"""Type alias for the list of parameters of a function."""
15def get_parameters(node: ast.arguments) -> ParametersType:
16 parameters: ParametersType = []
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))
43 if node.vararg:
44 parameters.append(
45 (
46 node.vararg.arg,
47 node.vararg.annotation,
48 ParameterKind.var_positional,
49 "()",
50 ),
51 )
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 )
70 if node.kwarg:
71 parameters.append(
72 (
73 node.kwarg.arg,
74 node.kwarg.annotation,
75 ParameterKind.var_keyword,
76 "{}",
77 ),
78 )
80 return parameters