1
1
import ast
2
+ import functools
2
3
from typing import List , Tuple , Union
3
4
4
5
from flake8_variables_names .list_helpers import flat
5
6
6
7
8
+ @functools .singledispatch
9
+ def extract_names_from_node (node ) -> List [ast .Name ]:
10
+ return []
11
+
12
+
13
+ @extract_names_from_node .register
14
+ def _extract_names_from_name_node (node : ast .Name ):
15
+ return [node ]
16
+
17
+
18
+ @extract_names_from_node .register
19
+ def _extract_names_from_assign_node (node : ast .Assign ):
20
+ return flat ([extract_names_from_node (target ) for target in node .targets ])
21
+
22
+
23
+ # in some versions of Python, singledispatch does not support `Union` in type annotations
24
+ @extract_names_from_node .register (ast .AnnAssign )
25
+ @extract_names_from_node .register (ast .For )
26
+ def _extract_names_from_annassign_node (node ):
27
+ return extract_names_from_node (node .target )
28
+
29
+
30
+ @extract_names_from_node .register
31
+ def _extract_names_from_starred_node (node : ast .Starred ):
32
+ return extract_names_from_node (node .value )
33
+
34
+
35
+ @extract_names_from_node .register
36
+ def _extract_names_from_tuple_node (node : ast .Tuple ):
37
+ return flat ([extract_names_from_node (elt ) for elt in node .elts ])
38
+
39
+
7
40
def get_var_names_from_assignment (
8
- assignment_node : Union [ast .Assign , ast .AnnAssign ],
41
+ assignment_node : Union [ast .Assign , ast .AnnAssign , ast . For ],
9
42
) -> List [Tuple [str , ast .AST ]]:
10
- if isinstance (assignment_node , ast .AnnAssign ):
11
- if isinstance (assignment_node .target , ast .Name ):
12
- return [(assignment_node .target .id , assignment_node .target )]
13
- elif isinstance (assignment_node , ast .Assign ):
14
- names = [t for t in assignment_node .targets if isinstance (t , ast .Name )]
15
- return [(n .id , n ) for n in names ]
16
- return []
43
+ return [(n .id , n ) for n in extract_names_from_node (assignment_node )]
17
44
18
45
19
46
def get_var_names_from_funcdef (funcdef_node : ast .FunctionDef ) -> List [Tuple [str , ast .arg ]]:
@@ -25,22 +52,13 @@ def get_var_names_from_funcdef(funcdef_node: ast.FunctionDef) -> List[Tuple[str,
25
52
return vars_info
26
53
27
54
28
- def get_var_names_from_for (for_node : ast .For ) -> List [Tuple [str , ast .AST ]]:
29
- if isinstance (for_node .target , ast .Name ):
30
- return [(for_node .target .id , for_node .target )]
31
- elif isinstance (for_node .target , ast .Tuple ):
32
- return [(n .id , n ) for n in for_node .target .elts if isinstance (n , ast .Name )]
33
- return []
34
-
35
-
36
55
def extract_all_variable_names (ast_tree : ast .AST ) -> List [Tuple [str , ast .AST ]]:
37
56
var_info : List [Tuple [str , ast .AST ]] = []
38
- assignments = [n for n in ast .walk (ast_tree ) if isinstance (n , ast .Assign )]
57
+ assignments = [
58
+ n for n in ast .walk (ast_tree )
59
+ if isinstance (n , (ast .Assign , ast .AnnAssign , ast .For ))
60
+ ]
39
61
var_info += flat ([get_var_names_from_assignment (a ) for a in assignments ])
40
- ann_assignments = [n for n in ast .walk (ast_tree ) if isinstance (n , ast .AnnAssign )]
41
- var_info += flat ([get_var_names_from_assignment (a ) for a in ann_assignments ])
42
62
funcdefs = [n for n in ast .walk (ast_tree ) if isinstance (n , ast .FunctionDef )]
43
63
var_info += flat ([get_var_names_from_funcdef (f ) for f in funcdefs ])
44
- fors = [n for n in ast .walk (ast_tree ) if isinstance (n , ast .For )]
45
- var_info += flat ([get_var_names_from_for (f ) for f in fors ])
46
64
return var_info
0 commit comments