【发布时间】:2020-04-03 07:28:31
【问题描述】:
在文档字符串中使用类型别名或typing 对象是否有最佳实践?
这个问题可能会吸引基于意见的答案。但也可能是 特定解决方案有广泛接受的约定或外部工具支持。
示例:函数返回带有字符串键和值的字典。您会将什么类型放入“返回”部分下的文档字符串中? (我使用的是pandas style docstrings。)
选项 1:直接说它是一个字典。
import typing
strstrdict = typing.Dict[str, str]
def foo() -> strstrdict:
'''
bla bla
Returns
-------
dict
A dictionary with string keys and values that represents ...
'''
# code
选项 2:使用类型别名。
import typing
strstrdict = typing.Dict[str, str]
def foo() -> strstrdict:
'''
bla bla
Returns
-------
strstrdict
A dictionary with string keys and values that represents ...
'''
# code
选项 3:将"typing.Dict[str, str]" 放入文档字符串中。
import typing
strstrdict = typing.Dict[str, str]
def foo() -> strstrdict:
'''
bla bla
Returns
-------
typing.Dict[str, str]
A dictionary with string keys and values that represents ...
'''
# code
选项 4:还有别的吗?
编辑 1
“我正在使用 pandas 风格的文档字符串”您是在寻找这种风格的答案还是一般的答案?
我想最佳答案将尽可能涵盖一般情况和具体情况。我提到了pandas 样式,以明确为什么有“返回”部分而没有像“:param:”这样的说明。关于答案,我并没有死心塌地。
您是否真的在文档中包含别名,即用户能否发现别名
strstrdict是什么?
目前没有关于别名的文档。用户可以查看themodule.strstrdict。我愿意在这里接受建议。
编辑 2
我链接到的样式指南碰巧提到了一个带有字符串键和值的字典。我正在寻找的答案也应该包括这样的情况:
from typing import Any, Callable, ContextManager, Iterable
ContextCallables = ContextManager[Iterable[Callable[[int, int], Any]]]
def foo() -> ContextCallabes:
'''
bla bla
Returns
-------
???
some description
'''
# code
【问题讨论】:
-
"我正在使用 pandas 风格的文档字符串" 您是在寻找这种风格的答案还是一般来说?您是否真的在文档中包含别名,即用户可以发现别名
strstrdict是什么? -
@MisterMiyagi 问题只能询问特定的风格,否则将不得不以基于意见的方式关闭。
-
@a_guest pandas docstring guide 和 numpydoc docstring guide 对于通过 annotations/
typing/aliases 提供的键入信息都不是权威的(根本不涉及该主题)。将问题限制在这些风格(我并不是说这不好)并不能阻止它基于意见(我并不是说它首先是)。 -
@MisterMiyagi 我编辑了我的问题以回应您的评论。
-
我认为在文档字符串中包含输入/返回类型的做法早于 PEP 484 类型,可能需要重新考虑。现在,如果您使用类型提示,则完全忽略文档字符串中的类型实际上可能会更好:它与签名中已有的内容是多余的。同样,我希望任何现代文档工具都知道如何使用类型提示/以干净的方式公开它们。例如,sphinx 有几个插件(例如sphinx-autodoc-typehints)。当然,这只是我的看法。