Как получить список доступных для pydoc путей для пакета python, например, numpy или тензорный поток?
Я пытаюсь получить все пути в пакете python (например, numpy), на котором вы можете использовать pydoc. В идеале этот список должен содержать такие элементы, как:
numpy numpy.linalg numpy.linalg.det...
Таким образом, в идеале можно было бы переходить в подмодули и классы внутри пакета, и эти пути были бы тем, что завершение вкладки дало бы вам во включенном редакторе. Я бы предпочел получить этот список из установленных пакетов для согласованности.
Цель этого списка - передать его в механизм нечеткого завершения, чтобы выбрать элементы для отправки в pydoc, например. набрав "det", движок выберет все записи, содержащие эту строку (поэтому мне не нужно запоминать полный путь к ней), и я могу выбрать ту, которая мне нужна. Эта часть проста, как только у меня есть список путей! Неважно, если это медленно, мне нужно сделать это только один раз, и я могу сохранить его в файл для последующего использования. Также не имеет значения, если список очень длинный. Механизм завершения может обрабатывать очень большие списки.
Есть ли простой способ сделать это? Я попробовал несколько вариантов с модулем inspect, рекурсивно используя атрибуты dict, даже один с rlcompleter, но до сих пор у меня либо не было большого успеха с рекурсией, либо пути не полезны в pydoc.
2 ответа
Да, есть способ сделать это. Например, для NumPy:
from pkgutil import walk_packages
import numpy
# Obtain list with all modules found in the package
mod_list = [name for _, name, _ in walk_packages(numpy.__path__,
numpy.__name__+'.')]
Это даст вам список mod_list
он содержит все подмодули, которые есть в пакете NumPy, в виде строк.
О, из вашего комментария вы имеете в виду все
type
s, что pydoc пересекает?
Pydoc ограничивает документацию списком, но я уверен, что если
__all__
равнялся одному классу, он по-прежнему документировал бы методы класса и т. д., которые сами по себе являются типами.
import numpy
print(numpy.__all__)
Я бы попытался использовать код обхода типа pydoc, но он настолько смешался с проблемами пользовательского интерфейса, что на самом деле не работает как «лучший»
inspect
модуль. Если не считать разветвления pydoc и изменения кода обхода типа до тех пор, пока вы не сможете создать аккумулятор «типа», я не уверен, что это возможно.