Sphinx 装饰类未记录

问题描述 投票:0回答:1

我正在使用 Sphinx 记录我的库。我有装饰器

logic_object
:

class logic_object:
    """Decorator for logic object class.
    """
    def __init__(self, cls):
        self.cls = cls
        self.__doc__ = self.cls.__doc__

我有

gravity
类,由
logic_object
装饰:

@logic_object
class gravity:
    """Basic gravity object logic class.

    :param float g: pixels of acceleration
    :param float jf: jump force
    """
#There is more not important code.

我的 Sphinx

.rst
文件是:

Mind.Existence
========================
Classes, methods and functions marked with * aren't for usual cases, they are made to help to the rest of the library.

.. automodule:: Mind.Existence
   :members:
   :member-order: bysource

logic_object
使用
autodoc
进行记录,但
gravity
没有记录。

为什么会发生这种情况以及如何解决?

python python-sphinx python-decorators autodoc
1个回答
5
投票

这是因为装饰类不是真正的类对象(不是

type
的实例),因此autodoc不知道如何记录它。

要修复它,您必须编写一个自定义文档编写器(例如在您的 conf.py 中):

from Mind.Existence import logic_object
from sphinx.ext.autodoc import ClassDocumenter

class MyClassDocumenter(ClassDocumenter):
    objtype = 'logic_object'
    directivetype = 'class'

    @classmethod
    def can_document_member(cls, member, membername, isattr, parent):
        return isinstance(member, logic_object)

def setup(app):
    app.add_autodocumenter(MyClassDocumenter)

然后(在你的装饰器中)你还必须从装饰对象中复制

__name__
__bases__
::

def __init__(self, cls):
    self.cls = cls
    self.__doc__ = cls.__doc__
    self.__name__ = cls.__name__
    self.__bases__ = cls.__bases__
© www.soinside.com 2019 - 2024. All rights reserved.