Python 覆盖Sphinx autodoc“;“的别名”;用于导入私有类?

Python 覆盖Sphinx autodoc“;“的别名”;用于导入私有类?,python,python-sphinx,autodoc,Python,Python Sphinx,Autodoc,我有一个Python包,我正试图用sphinx autodoc记录它。我的python包有一个\uuuu init\uuuu.py文件,该文件从子模块中导入一个类,以便在包级别访问它 from a.b.c.d import _Foo as Foo __all__ = ["Foo"] 如果我这样做,我的(html)文档如下所示: a.b.c套餐 子模块 a.b.c.d模块 [a.b.c.d模块中无关公共类的snip文档] 模块内容 c模块 a、 b.c.Foo \u Foo

我有一个Python包,我正试图用sphinx autodoc记录它。我的python包有一个
\uuuu init\uuuu.py
文件,该文件从子模块中导入一个类,以便在包级别访问它

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

__all__ = ["Foo"]
如果我这样做,我的(html)文档如下所示:

a.b.c套餐

子模块

a.b.c.d模块

[a.b.c.d模块中无关公共类的snip文档]

模块内容

c模块

a、 b.c.Foo

\u Foo的别名

因为
\u Foo
是(正确的)未记录的,因为它是a.b.c.d子模块中的私有类,所以不是非常有用

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

def skip(app, what, name, obj, skip, options):
    if name == "_Foo":
        return False
    return skip
其他选择,但不是我尝试过的好东西:

  • a.b.c.d.\u Foo
    重命名为
    a.b.c.d.Foo
    (然后将导入从a.b.c.d import Foo更新为
    )——但随后我将该类记录了两次,一次记录在a.b.c.d模块标题下,另一次记录在模块内容标题下
  • a.b.c.d.Foo
    重命名为
    a.b.c.d.MyFoo
    ,然后导入(
    从a.b.c.d导入MyFoo作为Foo
    )会导致
    MyFoo
    被记录,并且
    Foo
    被列为
    MyFoo
    的别名


  • 理想情况下,我希望私有定义保持未文档化,但将版本导入到包中并完全文档化。有人知道我是如何做到这一点的吗?

    斯芬克斯使用类的
    \uuuu name\uuuuuuu
    \uuuuu模块\uuuuuuuuu
    成员,以及类所有者的
    \uu模块\uuuuuuuuuuuuuu
    成员来判断它是别名还是真品。通过显式设置这些成员,可以欺骗Sphinx,使其认为导入的类是真实的类

    从a.b.c.d导入\u Foo作为Foo
    Foo.\uuuuu模块\uuuuu=\uuuuuu名称__
    Foo.\uuuuu name\uuuuuu='Foo'
    
    使用
    members
    指令,可以显示除以“\u”开头的成员以外的所有成员。您可以在a.b.c.d中将
    \u Foo
    保留为未记录,并在a.b.c.d中将其记录为
    Foo
    。我将从a.b.c.d导入
    \u Foo
    作为
    导入,然后添加任何文档,如:

    Foo = _Foo
    ''' blah blah blah '''
    
    如果出于某种原因,您不想在a.b.c的命名空间中使用_Foo,那么您也可以这样做:

    from a.b.c.d import _Foo as Foo
    Foo = Foo
    ''' blah blah blah '''
    

    如果执行此操作,则会中断
    inspect.getsource(Foo)
    conf.py
    中的
    setup
    函数中执行此操作,这样就不会弄乱原始源代码中的任何内容。例如: