重写Sphinx autodoc"Alias of"用于导入私有类?

Saf*_*aff 10 python python-sphinx autodoc

我有一个Python包,我试图用sphinx-autodoc记录.我的python包有一个__init__.py文件,它从子模块中导出一个类,使其可以在包级别访问.

from a.b.c.d import _Foo as Foo

__all__ = ["Foo"]
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我的(html)文档如下:

abc包

子模块

abcd模块

[在abcd模块中剪切不相关公共类的文档]

模块内容

c模块.

abc Foo

_Foo的别名

_Foo因为它是abcd子模块中的私有类,所以(正确地)没有文档,因此不是非常有用.

我可以在my中添加以下内容,以conf.py确保记录模块中的私有类定义.

def skip(app, what, name, obj, skip, options):
    if name == "_Foo":
        return False
    return skip
Run Code Online (Sandbox Code Playgroud)

其他替代方案,但不是我尝试过的好东西:

  1. 重命名a.b.c.d._Fooa.b.c.d.Foo(然后更新导入到from a.b.c.d import Foo) - 但后来我将类记录两次,一次在abcd模块标题下,再一次在Module内容标题下.
  2. 重命名a.b.c.d.Fooa.b.c.d.MyFoo,然后导入(from a.b.c.d import MyFoo as Foo)导致MyFoo被记录,并且Foo被列为一个别名MyFoo.

理想情况下,我希望私有定义保持未记录,但要将导入到包中的版本完整记录.有谁知道我怎么做到这一点?

bar*_*jak 4

Sphinx 使用类的__name____module__成员以及__module__类所有者的成员来确定它是别名还是真实的东西。通过显式设置这些成员,您可以欺骗 Sphinx 认为您导入的类是真正的类。

from a.b.c.d import _Foo as Foo
Foo.__module__ = __name__
Foo.__name__ = 'Foo'
Run Code Online (Sandbox Code Playgroud)

  • 在“conf.py”中的“setup”函数中执行此操作,然后您就不会弄乱原始源代码中的任何内容。例如:https://github.com/slundberg/shap/blob/6af9e1008702fb0fab939bf2154bbf93dfe84a16/docs/conf.py#L380-L394 (6认同)