RuntimeError:调用具有ast

时间:2015-05-07 16:43:02

标签: python python-2.7 recursion abstract-syntax-tree

我正在使用ast从Python源文件中获取信息(根据建议here)。为此,我扩展了ast.NodeVisitor,它可以与大多数源文件一起运行。但是,我得到了一个

RuntimeError: maximum recursion depth exceeded while calling a Python object

异常,当我在大班上使用它时(约2000行。可怕的练习。我知道:))。当我在崩溃时检查堆栈时,我发现确实存在非常深的递归,但它似乎没有进入循环。即,如果递归将继续进行,它将成功完成。有办法解决这个问题吗?

我不确定这是否与此有关,但这个大类包含一个大if ... elif ... elif ... elif ... else语句。

2 个答案:

答案 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)

我明白了:因为我只需要解析ClassDefImportFromImport语句,所以我给了generic_visit一个无效的方法:

def generic_visit(self, node):
    pass

而不是导致递归的超级generic_visit。这也极大地提升了性能。缺点是只解析模块全局范围内的语句(我认为),但这对我的需要很好。