通过AST获取模块名称

3 投票
1 回答
1493 浏览
提问于 2025-04-16 11:51

如何使用ast获取Python模块的名称?我尝试了以下方法来获取模块节点,但看起来它没有名称信息:

class v(ast.NodeVisitor):
    def visit_Module(self, node):
        print "Module : %s" % node

v().visit_Module(ast.parse(f.read(), filename))

我基本上需要实际的模块名称(如果它在一个包里面,那么就需要完整的名称,比如a.b.module)。

1 个回答

6

据我了解,这些信息在ast中是不存在的。更正式地说,Python中模块的抽象语法是:

mod = Module(stmt* body)
    | Interactive(stmt* body)
    | Expression(expr body)

    -- not really an actual node but useful in Jython's typesystem.
    | Suite(stmt* body)

所以你可以看到,一个Module只有一个主体,这个主体是一个语句节点的列表。它没有名字。

请注意,你将f.read()传递给访问者。这个方法会返回文件的内容,而不需要知道或关心这个文件的名字——那么你从中怎么获取模块名呢?

在执行Python代码时,你可以在代码内部使用__name____package__

撰写回答