-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtest_pytype_enhanced.py
130 lines (110 loc) · 4.2 KB
/
test_pytype_enhanced.py
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import ast
import json
from pytype import config
from pytype.tools.annotate_ast import annotate_ast
source = open("test.py").read()
def _get_node_key(node):
base = (node.lineno, node.__class__.__name__)
if isinstance(node, ast.Name):
# print(base)
# print(node.id)
return base + (node.id,)
elif isinstance(node, ast.Attribute):
print(base)
print(node.name)
print(node.attr)
return base + (node.attr,)
elif isinstance(node, ast.FunctionDef):
return base + (node.name,)
else:
return base
"""
def get_annotations_dict(module):
return {
_get_node_key(node): node.resolved_annotation
for node in ast.walk(module)
if hasattr(node, "resolved_type")
}
pytype_options = config.Options.create(python_version=(3, 10))
module = annotate_ast.annotate_source(source, ast, pytype_options)
types_dict = get_annotations_dict(module)
print(types_dict)
"""
def parse_type_hint(node):
if isinstance(node, ast.Name):
return node.id
elif isinstance(node, ast.Subscript):
return parse_type_hint(node.value)
elif isinstance(node, ast.Attribute):
return parse_type_hint(node.value) + "." + node.attr
elif isinstance(node, ast.Call):
return parse_type_hint(node.func)
elif isinstance(node, ast.Constant):
return node.value
return None
def get_annotations_list(module):
results = []
current_class = None
for node in ast.walk(module):
if hasattr(node, "resolved_type"):
"""if hasattr(node, "id"):
print(node.id)
elif isinstance(node, ast.Attribute):
print(node.attr)
else:
members = dir(node)
for member in members:
value = getattr(node, member)
print(f"{member}: {value}")"""
if isinstance(node, ast.ClassDef):
current_class = node.id
print(node.name)
if isinstance(node, ast.FunctionDef):
# print(node.id)
function = {
"file": "test.py",
"line_number": node.lineno,
"function": node.name,
"type": [node.resolved_annotation],
}
if current_class:
function["function"] = f"{current_class}.{node.name}"
results.append(function)
for param in node.args.args:
parameter = {
"file": "test.py",
"line_number": param.lineno,
"parameter": param.arg,
"function": node.name,
"type": [node.resolved_annotation],
}
if current_class:
function["function"] = f"{current_class}.{node.name}"
results.append(parameter)
elif isinstance(node, ast.Attribute):
parameter = {
"file": "test.py",
"line_number": node.lineno,
"parameter": node.attr,
"function": node.value,
"type": [node.resolved_annotation],
}
results.append(parameter)
elif isinstance(node, ast.Name) and isinstance(node.ctx, ast.Store):
variable = {
"file": "test.py",
"line_number": node.lineno,
"variable": node.id,
"type": [node.resolved_annotation],
}
results.append(variable)
return results
pytype_options = config.Options.create(python_version=(3, 10))
module = annotate_ast.annotate_source(source, ast, pytype_options)
annotations_list = get_annotations_list(module)
json_output = json.dumps(annotations_list, indent=4)
print(json_output)
""" members = dir(node)
for member in members:
value = getattr(node, member)
print(f"{member}: {value}")"""