我正在使用ast从Python源文件中获取信息(根据建议here)。为此,我扩展了ast.NodeVisitor
,它可以与大多数源文件一起运行。但是,我得到了一个
RuntimeError: maximum recursion depth exceeded while calling a Python object
异常,当我在大班上使用它时(约2000行。可怕的练习。我知道:))。当我在崩溃时检查堆栈时,我发现确实存在非常深的递归,但它似乎没有进入循环。即,如果递归将继续进行,它将成功完成。有办法解决这个问题吗?
我不确定这是否与此有关,但这个大类包含一个大if ... elif ... elif ... elif ... else
语句。
答案 0 :(得分:0)
我最近遇到了这个错误,我想这会对你有所帮助:
class MyNodeVisitor(ast.NodeVisitor):
def visit(self, node):
"""Visit a node, no recursively."""
for node in ast.walk(node):
method = 'visit_' + node.__class__.__name__
getattr(self, method, lambda x: x)(node)
答案 1 :(得分:-1)
我明白了:因为我只需要解析ClassDef
,Import
和FromImport
语句,所以我给了generic_visit
一个无效的方法:
def generic_visit(self, node):
pass
而不是导致递归的超级generic_visit
。这也极大地提升了性能。缺点是只解析模块全局范围内的语句(我认为),但这对我的需要很好。