【问题标题】:duplicate information in typing and docstring?键入和文档字符串中的重复信息?
【发布时间】:2021-11-18 04:27:22
【问题描述】:

我对类型提示和文档字符串的使用感到困惑。他们不是重复信息吗?

例如:

def my_func(name: str):
    """
    print a name.
    
    Parameters
    ----------
    name : str
       a given name
    """
    print(name)

信息name: str不是给了两次吗?

【问题讨论】:

  • 没有人告诉你做这种文档字符串是必须的
  • 如果函数定义已经包含该信息,您可能不需要在文档字符串中再次指定类型,具体示例,您可以查看 Google 样式指南(不是您需要跟随它或任何东西只是为了一些灵感)。
  • @U12-Forward 如果我用谷歌搜索“python docstring”,前几个结果有 docstring。如果我像在科学界一样进一步搜索“python docstring numpy”,那么第一个在文档字符串中都有类型提示。然而,文档字符串中似乎没有标准的类型提示样式,因此非常混乱。

标签: python type-hinting python-typing docstring


【解决方案1】:

将类型作为类型提示和文档字符串的一部分是多余的。它也容易出现人为错误,因为人们很容易忘记更新其中一个,因此需要不断努力使它们保持同步。

type hints 的文档也提到了它:

文档字符串。现有的文档字符串约定基于 Sphinx 表示法 (:type arg1: description)。这非常冗长(每个参数多一行),而且不是很优雅。我们也可以创造一些新的东西,但是注解语法很难被击败(因为它就是为此目的而设计的)。

但这一切都取决于你的用例。

  • 如果您正在使用诸如MyPy 之类的静态类型检查器(例如,如果您将一个int 123 传递给具有类型提示str 的变量,它将失败)或诸如PyCharm 之类的IDE(例如它会突出显示类型提示和传递的参数之间的不一致),那么您应该继续使用类型提示。这是最好的方法,因为它指出了您编写的代码中可能存在的错误。
  • 如果您使用SphinxSwagger 或其他工具,请注意这些工具会显示您的类和方法以及它们的文档字符串以用于文档编制。因此,如果您想维护此类文档以使其他读者清楚了解并希望包含类型,那么您可能也希望将类型提示放入文档字符串中。但是如果你认为不需要这些细节,因为大多数时候只有文档字符串中的描述是相关的,那么就不需要在文档字符串中添加类型提示。

从长远来看,更可持续的方法是让这些工具(Sphinx、Swagger 等)使用类型提示作为文档的一部分,而不是仅仅依赖于文档字符串中的文本。对于 sphinx,我发现这个库 sphinx-autodoc-typehints 已经执行了它。

允许您从这里迁移:

def format_unit(value, unit):
    """
    Formats the given value as a human readable string using the given units.

    :param float|int value: a numeric value
    :param str unit: the unit for the value (kg, m, etc.)
    :rtype: str
    """
    return '{} {}'.format(value, unit)

到这里:

from typing import Union

def format_unit(value: Union[float, int], unit: str) -> str:
    """
    Formats the given value as a human readable string using the given units.

    :param value: a numeric value
    :param unit: the unit for the value (kg, m, etc.)
    """
    return '{} {}'.format(value, unit)

因此,似乎已经对该主题进行了增强,这将使类型的定义更加一致,减少冗余。

【讨论】:

  • 对于 IDE,它还有助于智能感知/自动完成。至少对于 VS Code,键入函数参数将有助于 VS Code 在. 上建议方法/属性。
  • 感谢您的解释。总结一下:使用 Typing 优于在 docstring 中给出类型提示。问:this 是关于什么的?即我认为 numpy 风格是最受欢迎的风格之一;它真的已经过时了吗?我的误解来自我在科学界的有限视力?
  • @GinoMempin “对于 IDE,它也......” “它”指的是哪个?打字?
  • @Alex 您添加的链接是针对 Sphinx 使用的,正如我所说,它将在生成的文档中显示文档字符串。如果您想遵循该约定,那么没有问题,您只需保持一致即可。但是正如在类型提示文档中已经指出的那样,添加类型提示注释更加灵活,因为它可以用于静态类型检查并且也是自记录的。您的问题的答案可能是等待/请求/支持那些记录工具(例如 Sphinx)从类型提示中读取。我更新了答案以显示示例库。
  • @Alex 抱歉,“它”指的是类型提示。我发现 typehinting params 和 vars 有助于自动完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2011-07-02
  • 1970-01-01
相关资源
最近更新 更多