You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sphinx中选择性地为部分类生成私有成员函数的文档

如何在Sphinx中选择性地为部分类生成私有成员函数的文档

我完全懂你的困扰——全局开启private-members后,所有类的私有函数一股脑都出现在文档里,乱糟糟的,而你只想让基类的私有成员(方便子类重写参考)显示出来对吧?别着急,有两个实用的办法可以解决这个问题:

方法一:在单个类的文档指令中单独设置选项

首先把conf.py里的全局默认设置改回不显示私有成员,这样大部分类就不会自动展示私有函数了:

autodoc_default_options = {
    "members": True,
    "undoc-members": False,
    "private-members": False  # 全局默认关闭
}

然后在你的.rst文档源文件里,针对需要展示私有成员的基类,在autoclass指令后面加上:private-members:参数就行。比如:

.. autoclass:: my_project.base_classes.MyBaseClass
    :members:
    :private-members:  # 单独给这个基类开启私有成员文档
    :undoc-members: False

这样只有这个基类会显示它的私有成员,其他类都遵循全局默认的规则,完美实现选择性展示。

方法二:用Sphinx的钩子函数自定义跳过逻辑

如果你的基类数量比较多,一个个手动加指令参数太麻烦,可以用Sphinx的autodoc-skip-member钩子函数,写个自定义规则来自动判断哪些私有成员要保留。

在conf.py里添加下面的代码:

def skip_private_members(app, what, name, obj, skip, options):
    # 这里可以自定义判断逻辑,比如:
    # 1. 判断当前处理的是类
    # 2. 判断这个类是你需要的基类(比如命名带Base,或者继承自某个特定父类)
    if what == 'class':
        # 示例:如果类名以Base开头,就不跳过它的私有成员(_开头的)
        if obj.__name__.startswith('Base'):
            # 只处理单下划线开头的私有成员,双下划线的特殊方法默认跳过
            if name.startswith('_') and not name.startswith('__'):
                return False  # 返回False表示不跳过,即要生成文档
    # 其他情况保持默认的跳过逻辑
    return skip

def setup(app):
    # 把自定义函数注册到Sphinx的钩子上
    app.connect('autodoc-skip-member', skip_private_members)

你可以根据自己的项目结构调整判断条件,比如改成判断类是否继承自某个基类issubclass(obj, MyBase),这样更灵活。

小提示

  • 注意区分单下划线_xxx(私有成员)和双下划线__xxx(名称修饰的特殊方法),一般后者不需要放进文档,所以钩子函数里特意排除了它们。
  • 如果用方法一,要确保.rst文件里的指令参数和全局设置不冲突,比如全局已经开了members=True,就不用重复写啦。

备注:内容来源于stack exchange,提问作者KBriggs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:33:09