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

如何在Sphinx文档中显示私有成员常量的实际值?

解决Sphinx文档中私有常量值显示为None的问题

我之前也碰到过一模一样的情况,问题根源在于Python的**名称修饰(name mangling)**机制和Sphinx autodoc的默认行为冲突:双下划线开头的类属性会被Python自动重命名(比如你的__MY_TEST_CONSTANT会被改成_Test__MY_TEST_CONSTANT),而Sphinx的autodoc在扫描时找不到原始的__MY_TEST_CONSTANT属性,只能默认显示None。

下面给你几个可行的解决方案,按推荐程度排序:

方案1:改用单下划线前缀(最简便)

如果你的常量只是想标记为内部使用,不需要严格的名称修饰,把双下划线改成单下划线就搞定了。这样既保留了“私有”的语义,又能让autodoc正确识别并提取属性值:

class Test:
    """My Test Class"""
    _MY_TEST_CONSTANT = 98.2
    """My test constant docu"""

重新生成文档后,就能看到常量值正确显示为98.2了。

方案2:手动指定修饰后的属性值(适合必须保留双下划线的场景)

如果一定要用双下划线前缀,可以在你的.rst文档中手动补充属性的实际值。因为Python已经把__MY_TEST_CONSTANT重命名为_Test__MY_TEST_CONSTANT,你可以用autodata指令来修正显示:

.. automodule:: mymodule
    :members:
    :private-members:

.. autodata:: mymodule.Test._Test__MY_TEST_CONSTANT
    :annotation: = 98.2

不过这种方式需要手动维护值,当常量值变化时要同步更新文档,适合常量不常修改的场景。

方案3:自定义autodoc处理器(自动适配名称修饰)

如果你有很多双下划线前缀的常量,不想手动一个个维护,可以在Sphinx的conf.py中添加一个自定义处理器,自动识别并替换正确的属性值:

def fix_private_attr_value(app, obj, membername, options, lines):
    # 处理双下划线开头的非特殊方法/属性
    if membername.startswith('__') and not membername.endswith('__'):
        # 生成Python修饰后的属性名
        mangled_name = f"_{obj.__name__}{membername}"
        if hasattr(obj, mangled_name):
            actual_value = getattr(obj, mangled_name)
            # 找到显示"= None"的行并替换
            for idx, line in enumerate(lines):
                if f"{membername} = None" in line:
                    lines[idx] = f"{membername} = {actual_value}"

def setup(app):
    app.connect('autodoc-process-docstring', fix_private_attr_value)

这个函数会在autodoc处理类属性的docstring时,自动查找修饰后的属性名,获取实际值并替换文档中的None,一劳永逸解决批量私有常量的显示问题。

内容的提问来源于stack exchange,提问作者user5580578

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:37:44