Как создать документацию для проекта python, включая частные / защищенные классы с pdoc

#python #python-3.x #pdoc

#python #python-3.x #pdoc

Вопрос:

Я пытаюсь создать документацию для моего проекта python с pdoc помощью модуля, следуя этой статье .

Я заметил, что все классы, методы и т.д., начинающиеся с __ (частные / защищенные), отсутствуют в сгенерированной документации.

Это sample.py

 class __Members:
    def __test():
        pass

class seedoc:
    ''' see me '''
    pass
 

Вот как я сгенерировал документацию с помощью pdoc

 $pdoc --html sample.py
html/sample.html
 

Я вижу только общедоступный класс в сгенерированной документации согласно этому снимку экрана:
введите описание изображения здесь

Может кто-нибудь, пожалуйста, помочь мне найти способ преодолеть это ограничение и сгенерировать документацию со всеми частными / защищенными участниками? Заранее спасибо.

Ответ №1:

Pdoc извлекает только общедоступные члены API (без префикса подчеркивания) по соглашению.

Вы можете переопределить это поведение на уровне модуля, определив __all__ или, в более общем смысле, указав переопределения в __pdoc__ dict, либо вручную для нескольких членов, либо автоматически, но хакерски, что-то вроде:

 # Specified at the end of each module that contains private
# classes/methods that need to be exposed
__pdoc__ = {name: True
            for name, klass in globals().items()
            if name.startswith('_') and isinstance(klass, type)}
__pdoc__.update({f'{name}.{member}': True
                 for name, klass in globals().items()
                 if isinstance(klass, type)
                 for member in klass.__dict__.keys()
                 if member not in {'__module__', '__dict__', 
                                   '__weakref__', '__doc__'}})
 

В качестве альтернативы вам следует просто переименовать своих участников, если они являются частью вашего общедоступного API.

Также обратите внимание, что Python по умолчанию определяет десятки элементов dunder для объектов, большинство из которых имеют стандартное значение или являются внутренними:

 >>> class Cls:
...     pass

>>> dir(Cls)
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']