1 回答

TA贡献1906条经验 获得超10个赞
最后ast模块已经有了很方便的“walk”方法。
import ast
def get_deps(code):
body = ast.parse(code)
_, statements = next(ast.iter_fields(body))
full_graph = {
assign.targets[0].id: [
d.id for d in ast.walk(assign) if isinstance(d, ast.Name)
]
for assign in statements
}
# full_graph also contains `range` and `i`. Keep only top levels var
restricted = {}
for var in full_graph:
restricted[var] = [d for d in full_graph[var] if d in full_graph and d != var]
return restricted
if __name__ == "__main__":
d = get_deps(
"""
a0 = 1
a1 = 2
a2 = add(a0, a1)
a3 = [i + 1 for i in range(a2)]
"""
)
assert d == {"a0": [], "a1": [], "a2": ["a0", "a1"], "a3": ["a2"]}, d
添加回答
举报