什么是标准的Python文档字符串格式?

Noa*_*ith 826 python documentation coding-style docstring

我在Python中看到过几种不同的写作文档字符样式,是官方还是"同意"的风格?

dao*_*zli 920

格式

Python文档字符串可以按照其他帖子显示的几种格式编写.但是没有提到默认的Sphinx文档字符串格式,它基于reStructuredText(reST).您可以获得有关该tuto中主要格式的一些信息.

请注意,PEP 287建议使用reST

接下来是docstrings的主要使用格式.

- Epytext

从历史上看,类似javadoc的风格很普遍,因此它被作为Epydoc(使用被调用Epytext格式)生成文档的基础.

例:

"""
This is a javadoc style.

@param param1: this is a first param
@param param2: this is a second param
@return: this is a description of what is returned
@raise keyError: raises an exception
"""
Run Code Online (Sandbox Code Playgroud)

- reST

如今,可能更普遍的格式是sphinx用于生成文档的reStructuredText(reST)格式.注意:默认情况下,它在JetBrains PyCharm中使用(在定义方法后键入三引号并按Enter键).它也默认用作Pyment中的输出格式.

例:

"""
This is a reST style.

:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""
Run Code Online (Sandbox Code Playgroud)

- 谷歌

谷歌有自己经常使用的格式.它也可以由Sphinx解释(即使用拿破仑插件).

例:

"""
This is an example of Google style.

Args:
    param1: This is the first param.
    param2: This is a second param.

Returns:
    This is a description of what is returned.

Raises:
    KeyError: Raises an exception.
"""
Run Code Online (Sandbox Code Playgroud)

甚至更多的例子

- Numpydoc

请注意,Numpy建议您遵循自己的基于Google格式的numpydoc,并由Sphinx使用.

"""
My numpydoc description of a kind
of very exhautive numpydoc format docstring.

Parameters
----------
first : array_like
    the 1st param name `first`
second :
    the 2nd param
third : {'value', 'other'}, optional
    the 3rd param, by default 'value'

Returns
-------
string
    a value in a string

Raises
------
KeyError
    when a key error
OtherError
    when an other error
"""
Run Code Online (Sandbox Code Playgroud)

转换/生成

可以使用像Pyment这样的工具自动生成尚未记录的Python项目的文档字符串,或者将现有文档字符串(可以混合多种格式)从格式转换为另一种格式.

注意:这些示例来自Pyment文档

  • 我可能会补充说,reST是默认情况下JetBrains PyCharm中使用的,只需在定义方法后输入三引号并点击enter.https://www.jetbrains.com/pycharm/help/creating-documentation-comments.html (10认同)
  • 最全面的答案,包括历史感和当前的最佳实践.现在我们所需要的是一种社区运动的感觉,以一种新的"最佳"格式和一些额外的社区努力来创建从所有其他人到新的工具的迁移工具,所以我们实际上可以发展最佳实践. (10认同)
  • 我很惊讶没有人评论第一个文本行:目前它严格来说是正确的,但我觉得首选的方法是将它放在三重引号之后的第一行.PEP 8和PEP 257几乎在他们的所有例子中都做到了.PEP 287按照你的方式行事,但根据我的经验,这并不常见. (4认同)
  • 好答案.我敢说你可以在PyCharm(JetBrains)中更改默认文档字符串格式:设置 - >工具 - > Python集成工具 - >文档字符串格式.祝好运! (3认同)
  • 哟@ daouzli,google样式链接是404。我相信[此](https://google.github.io/styleguide/pyguide.html#Comments)是正确的。您也可以添加[sphinx谷歌样式示例](http://www.sphinx-doc.org/en/stable/ext/example_google.html)。好答案顺便说一句。编辑:我自己编辑了你的答案。 (2认同)
  • 我更喜欢谷歌格式,它真的很好读,而且不像 Numpydoc 那样使用那么多的垂直空间。恕我直言,Epytext 格式与 reST 格式一样杂乱无章。 (2认同)

Nat*_*han 322

谷歌的风格指南中包含一个优秀的Python风格指南.它包含可读docstring语法的约定,提供比PEP-257更好的指导.例如:

def square_root(n):
    """Calculate the square root of a number.

    Args:
        n: the number to get the square root of.
    Returns:
        the square root of n.
    Raises:
        TypeError: if n is not a number.
        ValueError: if n is negative.

    """
    pass
Run Code Online (Sandbox Code Playgroud)

我喜欢扩展它以在参数中包含类型信息,如本Sphinx文档教程中所述.例如:

def add_value(self, value):
    """Add a new value.

       Args:
           value (str): the value to add.
    """
    pass
Run Code Online (Sandbox Code Playgroud)

  • 我发现"docstrings中的签名"风格非常冗余和冗长.对于Python 3+,[功能注释](http://www.python.org/dev/peps/pep-3107/)是一种更清晰的方法.更糟糕的是,如果它使用伪强类型:Python更适合使用duck typing. (34认同)
  • 是的,但至少它给出了一个预期是什么样的鸭子的暗示,并且大多数开发者还没有在Python 3上 (26认同)
  • @Nathan,Google的样式指南建议使用描述性而非声明式的注释,例如"从Bigtable中获取行"而不是"从Bigtable中获取行".因此,将"Calculate ..."更改为"Calculates ..."将使您的示例与注释的其余部分更加一致,即"返回"和"提升". (5认同)
  • @Evpok个人而言,我不喜欢功能注释.要在其中使用类,您可能必须执行不必要的导入,要在其中使用字符串,您可能会非常快速地描述它们.到目前为止,我还没有看到将它们用于任何事情的重点. (3认同)
  • nit:遵循Google风格,使用描述性而不是命令式,即“ Calculates ...”和“ Adds ...” (2认同)

Tim*_*ara 229

文档字符串约定在PEP-257中比PEP-8更详细.

但是,docstrings似乎比其他代码领域更加个性化.不同的项目将有自己的标准.

我倾向于总是包含文档字符串,因为它们倾向于演示如何使用函数及其快速执行的操作.

无论字符串的长度如何,我都希望保持一致.我喜欢当缩进和间距一致时如何编码外观.这意味着,我使用:

def sq(n):
    """
    Return the square of n. 
    """
    return n * n
Run Code Online (Sandbox Code Playgroud)

过度:

def sq(n):
    """Returns the square of n."""
    return n * n
Run Code Online (Sandbox Code Playgroud)

并倾向于在更长的文档字符串中留下评论第一行:

def sq(n):
    """
    Return the square of n, accepting all numeric types:

    >>> sq(10)
    100

    >>> sq(10.434)
    108.86835599999999

    Raises a TypeError when input is invalid:

    >>> sq(4*'435')
    Traceback (most recent call last):
      ...
    TypeError: can't multiply sequence by non-int of type 'str'

    """
    return n*n
Run Code Online (Sandbox Code Playgroud)

意思是我发现像这样开始的文档字符串是混乱的.

def sq(n):
    """Return the squared result. 
    ...
Run Code Online (Sandbox Code Playgroud)

  • 请注意,PEP-8明确指出文档字符串应该写为命令/指令,而不是描述,例如.`"""返回平方结果"""而不是""""返回平方结果"""`.虽然PEP说的是,但就个人而言,我写的是Tim如何在这里. (88认同)
  • 我也不同意这个建议(使用命令式时态),因为它开始听起来比一句话更长的尴尬.此外,您正在描述*一个函数,而不是告诉读者该做什么. (60认同)
  • 当务之急是语法*情绪*.(抱歉.) (23认同)
  • _注意:规范而非描述性文档字符串的规范实际上出现在[PEP-257](http://www.python.org/dev/peps/pep-0257/#one-line-docstrings),而不是PEP-8. _我来自Java的传统,我在那里描述函数,但是当我的编程范式从面向对象转换为过程时,我终于开始使用命令式时态.当我开始使用[pycco](http://fitzgen.github.io/pycco/)生成文字编程风格的文档时,为什么提出了命令式时态变得非常明显.您应该根据您的范例进行选择. (12认同)
  • @ Mk12 Git提交消息也应该写成命令而不是描述.而且他们也在"*描述*"代码更改,"没有告诉读者该做什么".所以我认为将描述写成命令只是惯例. (5认同)
  • [PEP-257](http://www.python.org/dev/peps/pep-0257/#one-line-docstrings)说"单行是真正明显的案例.他们应该真的适合一行. " (4认同)
  • 在"我应该如何正确记录参数,返回值,引发异常等"的上下文中提到PEP-257是一个JOKE - 它不是关于它们的单词(尽管代码示例显示了一些).在可读性和功能方面,恕我直言谷歌格式是一个很好的选择. (2认同)
  • 我喜欢把它看作是查询函数:“你是做什么的?” 从这个角度来看,将其描述为去掉代词的第一人称(因为它们是隐含的)更有意义:“功能 X,你是做什么的?” 我......“返回一个数字的平方”对于提交也是如此。 (2认同)

jor*_*ris 53

显然没有人提到它:你也可以使用Numpy Docstring标准.它被广泛用于科学界.

用于解析Google风格文档字符串的Napolean sphinx扩展(在@Nathan的答案中推荐)也支持Numpy风格的文档字符串,并对两者进行简短比较.

最后一个基本的例子来说明它的样子:

def func(arg1, arg2):
    """Summary line.

    Extended description of function.

    Parameters
    ----------
    arg1 : int
        Description of arg1
    arg2 : str
        Description of arg2

    Returns
    -------
    bool
        Description of return value

    See Also
    --------
    otherfunc : some related other function

    Examples
    --------
    These are written in doctest format, and should illustrate how to
    use the function.

    >>> a=[1,2,3]
    >>> print [x + 3 for x in a]
    [4, 5, 6]
    """
    return True
Run Code Online (Sandbox Code Playgroud)

  • 我想这有点主观。一旦您有了更复杂的文档字符串(包含不同的部分、示例等,因此无论格式如何,无论如何都要占用大量垂直空间),我发现 numpydoc 格式更易于阅读/结构更好。 (5认同)
  • 恕我直言,NumPy 格式占用了太多的垂直空间,这在宽屏显示器上是稀缺的(除非您使用旋转 90 度的显示器,但我想大多数人不会)因此,恕我直言,Google 格式在可读性和功能方面是一个不错的选择。 (3认同)
  • 我个人觉得这么长的文档字符串最好放在文档中,而不是源代码中,如果太长,它们最终会妨碍模块的可读性。 (2认同)

bst*_*rre 13

PEP-8是官方的python编码标准.它包含一个关于docstrings的部分,它引用了PEP-257--一个完整的docstrings规范.

  • 在“我应该如何正确记录参数,返回值,引发的异常等”的上下文中提到PEP-257是一个笑话-它说的不是一个单词(尽管代码示例显示了一些)。IMHO Google格式在可读性和功能方面是不错的选择。 (4认同)

Col*_*nic 8

这是Python; 什么都行.考虑如何发布您的文档.除了源代码的读者之外,文档字符串是不可见的.

人们非常喜欢在网上浏览和搜索文档.为此,请使用文档工具Sphinx.它是记录Python项目的事实上的标准.产品很漂亮 - 看看https://python-guide.readthedocs.org/en/latest/.阅读文档的网站将免费托管您的文档.

  • 我经常使用`ipython`来测试驱动一个库,这使得阅读文档字符串变得简单 - 我只需输入`your_module.some_method_im_curious_about?`,我得到一个很好的打印输出,包括docstring. (21认同)
  • *library*或*API*的用户或正在编写*插件*的用户都可能会查看代码并需要理解它.我发现Python中的注释比Java或C#中更重要,因为未声明类型.如果评论大致了解传递和返回的鸭子类型,它会有很大帮助.(否则,你必须实际走完所有的代码并计算出一个给定的参数必须......可迭代到这里......支持那边的索引...最后支持数字减法......啊哈!它基本上是一个int数组.评论会帮助!) (8认同)
  • 诶,没有。文档字符串 ** 不** 不可见,这就是重点。如果您在记录的函数/方法/类上运行 `help` 函数,您将看到文档字符串(即使您只能访问已编译的模块,您也可以这样做)。我个人认为在选择文档字符串约定时应该牢记这一点(即它旨在按原样阅读)。 (2认同)

Fin*_*sen 7

我建议使用Vladimir Keleshev的pep257 Python程序根据PEP-257Numpy Docstring Standard检查您的文档字符串,以描述参数,返回值等。

pep257将报告您与标准的差异,称为pylint和pep8。