用ast获取模块名称

时间:2011-02-15 11:21:13

标签: python parsing abstract-syntax-tree

如何使用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 个答案:

答案 0 :(得分:4)

AFAIU,此信息不存在于ast中。更正式地说,Python中的Module的抽象语法是:

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代码开始,您可以在Python代码中使用__name____package__