元类不工作的狮身人面像自动类

Posted

技术标签:

【中文标题】元类不工作的狮身人面像自动类【英文标题】:Sphinx autoclass with metaclass not working 【发布时间】:2021-11-05 11:08:46 【问题描述】:

元类:

class RequestMeta(type):
    def __new__(mcs, what, bases, attrs):
        _attrs = name: decimal_to_string(attr) if callable(attr) else attr for name, attr in attrs.items()
        return super().__new__(mcs, what, bases, _attrs)

当我们为元类导入 RequestMeta 时,Sphinx 无法生成成员:

Class_name(metaclass=RequestMeta)
    def test
        """
        Get test
        :return:
        .. code-block:: json

            [
                
                "message":"test",
                "timestamp": 123
                
            ]
        """

test.rst:

Test
____

.. autoclass:: my_prog.a.Class_name
   :members:

【问题讨论】:

尝试在返回和代码块之间插入一个空行。 "blank line" 不会对任何 Python 代码产生任何影响,但对于 linter 警告。 (在这种情况下不是) 【参考方案1】:

问题可能在于您的decimal_to_string 装饰器。 Sphinx 不会关心元类,但如果在装饰函数时去掉它的属性,它就无能为力了。

检查 decimal_to_string 是否将其目标函数包装在 functools.wraps 中 - 这可能会解决您的问题。

【讨论】:

functools.wraps - 工作!!!谢谢!问题出在元类中的@decorator

以上是关于元类不工作的狮身人面像自动类的主要内容,如果未能解决你的问题,请参考以下文章

iOS中类元类isa详解

1104课堂小结

096 元类

面向对象之元类

面向对象-元类

python 吐血总结面向对象元类