Python ast:决定FunctionDef是否在ClassDef中



我想从Python源代码中构建一个ast,然后从ast中获取特定信息。我面临以下问题:虽然遍历ClassDef的主体是可行的,但我如何决定方法是否在类中。

我构建ast的代码来自:

class A:
def foo(self):
pass

def foo(self):
pass

在这个例子中,我将命中所有的foo,但我无法判断它是否来自类(因为它们有相同的参数集,名称不正确,但代码可以被解释(。

def build_ast(self):
with open(self.path, 'r', encoding='utf-8') as fp:
tree = ast.parse(fp.read())
for node in ast.walk(tree):
if isinstance(node, ast.FunctionDef):
print(ast.dump(node))
# access the parent if it has

我对我的最终解决方案并不完全满意,但显然它适用于Python 3.8.3:

根据我的经验,ast.walk在FunctionsDef节点之前遍历ClassDef节点。

def build_ast(self):
with open(self.path, 'r', encoding='utf-8') as fp:
tree = ast.parse(fp.read())
for node in ast.walk(tree):
if isinstance(node, ast.FunctionDef):
if hasattr(node, "parent"):
print(node.parent.name, node.name)
else:
print(node.name, "is not in a class.")
if isinstance(node, ast.ClassDef):
for child in node.body:
if isinstance(child, ast.FunctionDef):
child.parent = node

相关内容

  • 没有找到相关文章

最新更新