通过AST获取模块名称
如何使用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__
。