使用ast获取模块名称

发布于 2024-10-17 14:25:39 字数 282 浏览 5 评论 0原文

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

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

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

我基本上需要实际的模块名称(如果它位于包内,则需要完整的名称,例如 abmodule)。

How to get a python module name using ast? I tried the following to get the Module Node, but looks like it does not have the name information:

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

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

I basically need the actual module name (If it is inside a package then the complete one like a.b.module).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

几度春秋 2024-10-24 14:25:39

AFAIU,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)

因此,正如您所看到的,模块只有一个主体,它是语句节点列表。没有名字。

请注意,您将 f.read() 传递给访问者。它返回文件的内容,而不实际知道或关心该文件是如何命名的 - 您可以从哪里获取模块名称?

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

AFAIU, this information doesn't exist in ast. More formally, the abstract grammar for Module in Python is:

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

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

So as you can see a Module just has a body which is a list of statement nodes. There's no name.

Do note that you pass f.read() to the visitor. That returns the contents of the file, without actually knowing or caring how that file is named - where can you take the module name from it?

From executing Python code, you can use __name__ and __package__ from inside Python code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文