Получение Sphinx autodoc для включения «скрытых» классов

У нас есть модуль, в котором каждый файл класса находится в файле, начинающемся с подчеркивания. В init.py мы импортируем эти файлы и предоставляем функции конструктора для каждого класса (это необходимо, поскольку каждому конструктору класса требуется дополнительное состояние, которое мы не хотим, чтобы пользователи модуля нуждались в нем). возиться).

Например. у нас может быть _foo.py с:

class Foo(object):
  def __init(context, params):
    ...

и в init.py у нас есть:

from ._foo import Foo as _Foo

def foo(params):
  return _Foo(_getContext(), params)

Я пытаюсь создать для этого документацию с помощью Sphinx autodoc. Я, очевидно, хочу, чтобы была создана документация для Foo и его методов (хотя желательно не для его конструктора), а также для оболочки конструктора foo().

Я могу заставить Sphinx генерировать документы для foo(), но не могу заставить его генерировать что-либо для Foo. Я пробовал:

.. automodule:: foo_module
    :members:

так же как:

.. autoclass:: foo_module.Foo
    :members:

но безрезультатно. Первый просто включает foo(); последний дает мне ошибку:

index.rst:17: WARNING: autodoc: failed to import class u'Foo' from module u'foo_module'; the following exception was raised:
Traceback (most recent call last):
  File "/python2.7/site-packages/sphinx/ext/autodoc.py", line 342, in import_object
    obj = self.get_attr(obj, part)
  File "/python2.7/site-packages/sphinx/ext/autodoc.py", line 241, in get_attr
    return safe_getattr(obj, name, *defargs)
  File "/python2.7/site-packages/sphinx/util/inspect.py", line 114, in safe_getattr
    raise AttributeError(name)
AttributeError: Foo

Есть ли способ обойти это?


person Graham Wheeler    schedule 07.04.2015    source источник
comment
Попробуйте определить __all__, чтобы включить _Foo   -  person kindall    schedule 07.04.2015
comment
Это работает, но это означает, что мы открываем конструктор Foo. Я предполагаю, что нет никакого способа обойти это, поскольку Foo.__init__ задокументирован не как метод, а как класс заголовка класса Foo(context, params). Хотя на самом деле это не работало с _Foo; Мне пришлось изменить init, чтобы использовать from ._foo import Foo и убрать подчеркивание, прежде чем это сработало.   -  person Graham Wheeler    schedule 07.04.2015
comment
Не помещайте метод __init__ непосредственно в класс; вместо этого назовите его как-то вроде _init (при условии, что вы не документируете частные члены) и включите __init__ = _init в класс. :-)   -  person kindall    schedule 07.04.2015


Ответы (1)


Давно, но...

Просто используйте параметр директивы :private-members:.

Из https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html

person red-isso    schedule 18.04.2021
comment
да, верно; Спасибо ;) - person red-isso; 18.04.2021