-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpep_analyzer.py
More file actions
35 lines (28 loc) · 1.22 KB
/
pep_analyzer.py
File metadata and controls
35 lines (28 loc) · 1.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import ast
from collections import defaultdict
class PepAnalyzer(ast.NodeVisitor):
def __init__(self):
self.stats: dict[str, dict[int, list]] = {
"variables": defaultdict(list),
"parameters": defaultdict(list),
"is_constant_default": defaultdict(list),
}
def visit_Name(self, node):
if isinstance(node.ctx, ast.Store):
self.stats["variables"][node.lineno].append(node.id)
self.generic_visit(node)
def visit_FunctionDef(self, node):
for a in node.args.args:
self.stats["parameters"][node.lineno].append(a.arg)
for a in node.args.defaults:
self.stats["is_constant_default"][node.lineno].append(isinstance(a, ast.Constant))
self.generic_visit(node)
def get_parameters(self, lineno: int) -> list:
return self.stats["parameters"][lineno]
def get_variables(self, lineno: int) -> list:
return self.stats["variables"][lineno]
def get_mutable_defaults(self, lineno: int) -> str:
for param_name, is_default in zip(self.stats["parameters"][lineno], self.stats["is_constant_default"][lineno]):
if not is_default:
return param_name
return ""