Sphinx 文档模块属性

2024-01-08

我有一个模块应该有@property,我通过设置一个类作为模块解决了这个问题。我从这个答案中得到了这个想法:惰性模块变量——可以做到吗? https://stackoverflow.com/questions/1462986/lazy-module-variables-can-it-be-done/1463773#1463773

我希望它是可重复且易于使用的,所以我为它创建了一个元类。这就像一个魅力。

问题是,当使用 Sphinx 生成文档属性时,不会记录属性。其他一切都按预期记录。我不知道如何解决这个问题,也许这是 Sphinx 的问题?

该模块:

import sys
import types

class ClassAsModule(type):
    def __new__(cls, name, bases, attrs):
        # Make sure the name of the class is the module name.
        name = attrs.pop('__module__')
        # Create a class.
        cls = type.__new__(cls, name, bases, attrs)
        # Instantiate the class and register it.
        sys.modules[name] = cls = cls(name)
        # Update the dict so dir works properly
        cls.__dict__.update(attrs)

class TestClass(types.ModuleType):
    """TestClass docstring."""
    __metaclass__ = ClassAsModule
    @property
    def some_property(self):
        """Property docstring."""
        pass
    def meth():
        """meth doc"""
        pass

以及复制粘贴来生成/查看 Sphinx 文档:

sphinx-apidoc . -o doc --full
sphinx-build doc html
xdg-open html/module.html

最重要的部分是记录类的属性。奖励点还记录原始模块成员。

EDIT:该类应记录为它所在的模块。该类以这种方式使用,因此在 Sphinx 中也应以这种方式显示。

所需输出的示例:

Module Foo
    TestClass docstring.

    some_property
        Property docstring.

    meth()
        meth doc

EDIT 2:我发现了一些可能有助于找到解决方案的东西。当有常规模块时foo包含以下内容:

#: Property of foo
prop = 'test'

Sphinx 的文档如下:

foo.prop = 'test'
    Property of foo

同样的工作如果prop是一个类的属性。我还没有弄清楚为什么它在我的特殊情况下不起作用。


这是我的理解。

理论是:让你的类像模块一样工作,这种(有点hacky)方式让sphinx认为他不需要(解析)模块中的属性(因为它是类级别的)范例)。所以,对于斯芬克斯来说,TestClass是一个模块。

首先,为了确保罪魁祸首是使类充当模块的代码 - 让我们删除它:

class ClassAsModule(type):
    pass

我们将在文档中看到:

package Package
    script Module

    class package.script.ClassAsModule
        Bases: type

    class package.script.TestClass
        Bases: module

        TestClass docstring.

        meth()
            meth doc

        some_property
            Property docstring.

如您所见,sphinx 读取该属性没有任何问题。这里没什么特别的。


您的问题的可能解决方案是避免使用@property装饰器并将其替换为调用property类构造函数。例如。:

import sys
import types

class ClassAsModule(type):
    def __new__(cls, name, bases, attrs):
        # Make sure the name of the class is the module name.
        name = attrs.pop('__module__')
        # Create a class.
        cls = type.__new__(cls, name, bases, attrs)
        # Instantiate the class and register it.
        sys.modules[name] = cls = cls(name)
        # Update the dict so dir works properly
        cls.__dict__.update(attrs)


class TestClass(types.ModuleType):
    """TestClass docstring."""
    __metaclass__ = ClassAsModule

    def get_some_property(self):
        """Property docstring."""
        pass

    some_property = property(get_some_property)

    def meth(self):
        """meth doc"""
        pass

对于此代码,sphinx 生成:

package Package
    script Module
        TestClass docstring.

            package.script.get_some_property(self)
                Property docstring.

            package.script.meth(self)
                meth doc

也许答案是废话,但我希望它能为您指明正确的方向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sphinx 文档模块属性 的相关文章

随机推荐

  • 上下文、AsyncTask 和轮换更改

    这是一个很好的做法吗getApplicationContext 使用 AsyncTask 以便不必附加和分离 Activity以避免内存泄漏when发生旋转变化并且活动被破坏 我认为它应该是正确的 因为我实际上需要一个依赖于洞应用程序的上下
  • 使用 Gmail 凭据登录

    有没有一种方法可以使用 Google 凭据来获取基本用户信息 例如 电子邮件 姓名 性别 并在我的应用程序中使用它们 这就像允许用户使用 Gmail 登录我的应用程序一样 我也问了同样的问题here https stackoverflow
  • ggplot2 二维密度权重

    我正在尝试使用 R 中的 ggplot2 用二维密度轮廓绘制一些数据 我得到一个有点奇怪的结果 首先 我设置了 ggplot 对象 p lt ggplot data aes x Distance y Rate colour Company
  • 如何让 gVim 的 vimdiff 忽略大小写?

    我正在尝试比较两个程序集文件 其中一个文件全部大写 另一个文件全部小写 许多行在大小写和空格方面都是相同的 我尝试了以下操作 同时两个缓冲区处于差异模式 set diffopt icase set diffopt iwhite diffup
  • List.Add 似乎是重复的条目。怎么了?

    我有一堂这样的课 public class myClass public List
  • 计划任务的限制(或者任务持久化是如何实现的)?

    我开始阅读 Hangfire 文档 但没有发现任何有关任务限制的信息 正如声明的那样 任务 或作业 存储在某个地方 由于它们只是代表 据我所知 唯一可以存储的东西是代表 主体 IL 但是可能存在闭包 它为任务提供了一些上下文 例如一些外部服
  • 如何在Python中对二进制文件进行base64编码/解码?

    我正在尝试使用 python 使用以下简单代码对同一图像文件进行编码和解码 但每次输出文件都大于输入文件并且无法打开 这段代码有什么问题 import base64 with open img jpeg rb as image file e
  • 多线程异常和Dispose。为什么 Dispose 没有调用?

    using 语句保证该对象将被调用 Dispose 方法 在此示例中 这种情况没有发生 并且终结器方法也没有调用 为什么这一切 当其他线程发生异常时 如何更改代码以保证处理我的对象 class Program static void Mai
  • JavaScript 中的动态方法调用

    我知道我可以这样做 var myClass my class definition var methodName myMethod myClass methodName p1 p2 pN 但如果有这样的情况我该怎么办 if data som
  • 在 tkinter 画布上绘制 png 图像 python

    我正在尝试使用创建一个简单的游戏tkinter in python 3 5使用画布小部件 对于这个游戏 我需要能够使用透明 png 图像 这是我的代码 from PIL import ImageTk from tkinter import
  • 我可以使用 PHP 读取 .TXT 文件吗?

    当我开始使用 PHP 和 MySQL 编写站点时 我编写的第一个 PHP 脚本之一是初始化数据库的脚本 删除 创建数据库 删除 创建每个表 然后从脚本中的文字加载表 一切正常 呼呼 但我更喜欢从文件中读取数据 而不是在 PHP 脚本中对它们
  • 对 C99 可变长度数组 (VLA) 使用限制限定符

    我正在探索 C99 中简单循环的不同实现如何根据函数签名自动矢量化 这是我的代码 define PRAGMA SIMD Pragma simd define PRAGMA SIMD ifdef INTEL COMPILER define A
  • 调整容器引擎集群上实例类型的大小

    我们的一些容器在内存高于容器引擎集群中当前部署的实例类型时运行得更好 创建容器引擎集群后 是否有推荐的做法来为较大的实例重建容器引擎模板 例如 从 GCE 实例 n1 standard 2 到 n1 highmem 8 来运行具有 8GB
  • 为什么我的配置项没有从 codeigniter 中的 getenv() 条目填充?

    我将 phpdotenv 与 Codeigniter 一起使用 Codeigniter 的环境设置不太适合这个项目 我试图在我的 config php 文件中设置它 config site id getenv APP ID phpdoten
  • 在 Android 中以编程方式撤销权限

    是否可以在 Android Marshmallow 中删除或撤销应用程序的权限 请注意 它应该在运行时完成 因此使用 ADB shell 脚本或将应用程序转换为其字节 DEX 代码是不可能的 因为架构更改不是所需解决方案的选项 仅当您的应用
  • 高效排序 mongodb 地理空间查询的结果

    我有大量文档 例如 loc 10 32 24 34 relevance 0 434 并希望能够有效地执行如下查询 loc geoWithin box 103 10 1 80 43 30 232 与任意盒子 添加二维索引loc使得这非常快速和
  • PHP/GD:更好的高斯模糊

    我想用 GD 库模糊图像 不幸的是 GD 提供的 GAUSSIAN BLUR 效果还不够 我想要更多blurrish
  • ComBox 更改后用时间计算填充列表框

    我这里有一个简单的用户表单 它根据组合框的更改填充列表框 组合框中唯一列表的代码 Private Sub UserForm Initialize used this code to get a dynamic combobox unique
  • 在 gnu Makefile 中组合多个 ifeq 和 ifneq

    如果语法如下 如何添加多个选择 ifeq VAR1 some string 结合 ifneq VAR2 some other string 结合更多 有单线吗 像 幻想代码 ifeq VAR1 some string and not VAR
  • Sphinx 文档模块属性

    我有一个模块应该有 property 我通过设置一个类作为模块解决了这个问题 我从这个答案中得到了这个想法 惰性模块变量 可以做到吗 https stackoverflow com questions 1462986 lazy module