如何在Python中记录结构?
如果一个函数的参数需要是某种特定的结构,比如用 Python 的 list
、tuple
和 dict
创建的结构,那么应该怎么和在哪里进行说明呢?
下面是一个示例 文档:
def foo(bar):
"""
Args:
bar: 2-tuple, ([(<mapping>,<number>), ...], <string>)
"""
pass
这个示例有点繁琐,存在一些问题:
- 这个结构很难读懂
- 很难说明结构中每个元素的具体含义
- 怎么表示长度不是固定的
- 应该只在一个地方说明,还是到处都要说明
- 补充:怎么清楚地表明某个元素可以是鸭子类型(也就是说,"dict" 和 "像映射的东西" 都可以)
补充:这个示例并不是为了强制规定类型,而是为了说明一种结构。在这个情况下,鸭子类型
是 可以的。
6 个回答
1
我简单回答你的问题就是引用一下Python的哲学:"明确比隐含更好"。对于你的问题来说,这意味着要把需要的内容写得清清楚楚,哪怕为了说明一个参数需要写一整段话。你可以看看Python的文档,里面有很多例子。在你的具体情况下,你可以用序列来表示鸭子类型,而不是用元组(可以参考http://docs.python.org/2/library/collections.html#collections-abstract-base-classes)。
1
如果你在使用Python 3,可能会对“函数注解”感兴趣。它们不是强制的,完全可以选择使用,但看起来能满足你的需求。注解可以是任何Python表达式,它们会放在函数头部,和参数一起。例如(抱歉这个例子有点无厘头):
def fn(name: str, age: int, hobbies: "something else goes here") -> max(2, 9):
# la la la
return 9
这里有更多的细节(包括可能的使用场景和示例):PEP 3107
4
我在工作中遇到了这个问题。根据我个人的研究(也就是做了一些比较全面的谷歌搜索),发现没有一个标准的方法来记录复杂的、嵌套的函数参数。于是我自己想出了一个方法,用 <>
来表示数据结构中的 元素,每个元素都有自己的标题和段落来说明。在这里举个例子:
<options>
---------
A mapping:
{'years':<years>,
'states':<states>}
This is the root level of the `options` argument.
<years>
-------
A sequence of integers, each of which is a year to be included in the analysis.
<states>
--------
A sequence of strings, each of which is a state to be included in the analysis.
这些文档可以放在函数的文档字符串里,但在我的情况下,我选择把它单独写成一个文档。这个方法也可以扩展到更复杂的结构。比如,你可以在我的文档 这里 查看。