问题 在Sphinx中,有没有办法记录参数并声明参数?


我更喜欢在我声明参数的同一行记录每个参数(根据需要)以便应用 干。

如果我有这样的代码:

def foo(
        flab_nickers, # a series of under garments to process
        has_polka_dots=False,
        needs_pressing=False  # Whether the list of garments should all be pressed
   ):
    ...

如何避免重复doc字符串中的参数并保留参数说明?

我想避免:

def foo(
        flab_nickers, # a series of under garments to process
        has_polka_dots=False,
        needs_pressing=False  # Whether the list of garments should all be pressed
    ):
    '''Foo does whatever.

    * flab_nickers - a series of under garments to process
    * needs_pressing - Whether the list of garments should all be pressed.
      [Default False.]

在python 2.6或python 3中是否可以使用某种装饰器操作?还有其他方法吗?


4443
2018-02-03 19:21


起源

如果您的RST足够干净(Sphinx's params真的没有帮助),应该很容易看到函数定义然后进入docstring。我避开了默认的Sphinx风格(带有它的 params)并寻找看起来像的Google风格 好得多 在代码中,渲染时仍然不错(这个问题 谈论获得最佳两个世界)。 - Nick T


答案:


我会这样做的。

从这段代码开始。

def foo(
        flab_nickers, # a series of under garments to process
        has_polka_dots=False,
        needs_pressing=False  # Whether the list of garments should all be pressed
   ):
    ...

我会写一个解析器来抓取函数参数定义并构建以下内容:

def foo(
        flab_nickers, 
        has_polka_dots=False,
        needs_pressing=False,
   ):
   """foo

   :param flab_nickers: a series of under garments to process
   :type flab_nickers: list or tuple
   :param has_polka_dots: default False
   :type has_polka_dots: bool
   :param needs_pressing: default False, Whether the list of garments should all be pressed
   :type needs_pressing: bool
   """
    ...

这是一些非常直接的正则表达式处理各种参数字符串模式来填充文档模板。

许多优秀的Python IDE(例如PyCharm)都了解默认的Sphinx param IDE认为不符合声明类型的范围中的符号甚至标志变量/方法。

注意代码中的额外逗号;这只是为了使事情保持一致。它没有任何害处,它可能会简化未来的事情。

您还可以尝试使用Python编译器来获取解析树,修改它并发出更新代码。我已经为其他语言(不是Python)做了这个,所以我对它有点了解,但不知道它在Python中的支持程度如何。

此外,这是一次性转型。

函数定义中的原始内联注释并不真正遵循DRY,因为它是一种注释,使用非正式语言,并且除了最复杂的工具之外不能使用。

Sphinx评论更接近DRY,因为它们采用RST标记语言,使得使用普通文本解析工具更容易处理 docutils

如果工具可以使用它,那只是DRY。

有用的链接: https://pythonhosted.org/an_example_pypi_project/sphinx.html#function-definitions http://sphinx-doc.org/domains.html#id1


8
2018-02-03 19:27



'an_example_pypi_project'的Python文档 显示Sphinx文档字符串格式选项。 - Mike Pennington
不,该文档中的评论不起作用:“Args:name(str):要使用的名称。” - MeaCulpa


注释旨在部分解决Python 3中的这个问题:

http://www.python.org/dev/peps/pep-3107/

我不确定是否还有任何将这些应用于Sphinx的工作。


5
2017-08-26 19:57



我今天看了看Sphinx代码,我可以确认Sphinx至少支持返回注释。参数类型注释在那​​里很有用,但目前看来基本上是初级的。 - obskyr


没有预处理器就不能这样做,因为一旦编译了源代码,Python就不存在注释。为避免重复自己,请删除注释并仅在docstring中记录参数,这是记录参数的标准方法。


1
2018-02-03 19:31



也许这是一个坏习惯,但在使用Verilog(硬件设计语言)之后我获得了内联文档的味道,其中顶级模块的参数列表可以有一百个参数。因此,如果您将Verilog参数文档放在实际参数文档行之外,它们可能会被100行分隔,这对于可维护性来说非常糟糕。 - Ross Rogers
对于这些顶级verilog模块,您有很多人修改此文件,因此您不能依赖人们成为好公民。无论如何,你可能是对的。它可以是圆孔中的方形钉。 - Ross Rogers
@Ross Rogers:Sphinx将为您识别坏公民。如果:param name:与实际参数不匹配,则会收到警告。 - S.Lott
@Ross Rogers:是的:方形钉圆孔。 Python中100个参数列表就是代码味道。如果你有这样的参数列表,你可能做错了。 - S.Lott
@Lott。 - 我没有100个参数:-)我只是在解释这个野蛮的概念来自哪里。某种方法确实有7个参数。但是在Verilog中,100个参数是绝对必要的,因为跨模块引用无法通过某些硬件综合工具合成到门。 - Ross Rogers