Получение имени модуля с помощью ast - PullRequest
2 голосов
/ 15 февраля 2011

Как получить имя модуля python, используя ast?Я попробовал следующее, чтобы получить узел модуля, но похоже, что у него нет информации об имени:

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

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

Мне в основном нужно фактическое имя модуля (если оно находится внутри пакета, то полное, например, abmodule)).

1 Ответ

5 голосов
/ 15 февраля 2011

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)

Итак, как вы можете видеть, Module просто имеет тело, представляющее собой список узлов операторов. Там нет имени.

Обратите внимание, что вы передаете f.read() посетителю. Это возвращает содержимое файла, фактически не зная или не заботясь о том, как назван этот файл - где вы можете взять имя модуля из него?

При выполнении кода Python вы можете использовать __name__ и __package__ из кода Python.

...