为什么定义在 NumPy 文档字符串部分中的冒号前有一个空格?



Numpy docstring guide 说:

冒号前面必须有一个空格,如果类型不存在,则省略。

并举了一个例子:

Parameters
----------
x : type
Description of parameter `x`.
y
Description of parameter `y` (with type not specified)

另一方面, PEP8 从字面上说冒号前的空格是错误的:

# Wrong:
code:int  # No space after colon
code : int  # Space before colon

我知道这适用于代码,而不是文档字符串,但为什么不保持一致呢?

问题

在冒号放一个空格的动机是什么?

它似乎违反了印刷规则以及 python 惯例(或至少是直觉(。

为什么冒号前有空格?

因为在 NumPy 语法中,某些文档字符串部分内的语法定义与 reStructuredText 定义列表的语法一致。 请注意,语法与以下各项的 reST 标记规范完全相同:

定义列表

每个定义列表项都包含一个术语、可选分类器和一个定义。术语是一个简单的单行单词或短语。可选分类器可以在同一行上跟在术语后面,每个分类器后面都有一个内联 " : "(空格、冒号、空格(。

Syntax diagram:
+----------------------------+
| term [ " : " classifier ]* |
+--+-------------------------+--+
| definition                 |
| (body elements)+           |
+----------------------------+

这是有道理的,因为 numpydoc 明确声明了其对 PEP 257 的预期合规性。

Numpydoc 文档字符串指南

概述

我们主要遵循标准 Python 风格约定,如下所述:

  • 文档字符串约定 - PEP 257

PEP 声明了其意图,即文档字符串应使用 reST 结构编写:

摘要,PEP 287

本PEP建议采用reStructuredText标记作为Python文档字符串中结构化明文文档的标准标记格式。

这也可以通过引用 numpydoc 贡献者的决定来验证,例如:

问题 #87

现在numpydoc格式实际上是有效的rst(只是对某些标记结构进行了一些特殊的解释(,例如参数字段是一个定义列表,其中类型是"分类器"(http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#definition-lists(。我认为保留此属性是值得的,行尾反斜杠这样做(它们根本不出现在字符串本身中(,而提议的"识别缩进"语法则没有。

在几个地方提到了同样的推理:

公关 #107

这可能属于"如果它没有坏,就不要修复它"的类别,但我注意到我们奇怪地将块引号用于参数列表而不是定义列表。更新:现在这个 PR 建议默认使用定义列表,并切换使用旧块引用。

冒号前空格的具体规则可以在 numpydoc.validate.py 源代码和文档中看到:

内置验证检查

"PR10": 'Parameter "{param_name}" requires a space before the colon '
"separating the parameter name and type"

总之,要使用 reST 编写文档字符串(以符合 PEP 257(,reST 正文元素中没有太多列表标记结构可供选择。定义列表只是最佳选择,因为它的术语/分类器语法完全符合 Python 对象的名称/类型列表。



针对问题中提出的直观反对意见:

另一方面,PEP8 字面意思是冒号前的空格是错误的

是的,但是 PEP 8 提到的函数和变量注释不是指文档字符串(文档字符串(!这些用于签名和变量声明。

相关内容

最新更新