Python文档:可迭代多次?

时间:2011-11-29 05:49:25

标签: python duck-typing

在记录Python函数时,我发现它更像Pythonic:

def Foo(i):
    """i: An interable containing…"""

......而不是......

def Foo(i):
    """i: A list of …"""

i确实不需要是list时。 (Foo会愉快地对settuple等进行操作。问题是生成器。生成器通常只允许1次迭代。 大多数函数都可以使用只允许单次传递的生成器或迭代器,但有些不是。

对于那些不能接受只能迭代一次的生成器/东西的函数,是否有一个清晰,一致的Python术语来说“只能迭代多次的东西”?

iterableiterator的Python词汇表似乎有一个“一次,但如果你很幸运的话可能更多”。

2 个答案:

答案 0 :(得分:2)

我不知道这个标准术语,至少不是随便的,但我认为如果你需要一个短语,“可重复使用的可迭代”会得到重点。

在实践中,通常可以构建您的函数,这样您就不需要多次迭代i。或者,您可以从迭代中创建一个列表,然后根据需要多次遍历列表;或者您可以使用itertools.tee获取迭代器的多个独立“副本”。即使您确实需要多次使用它,也可以接受生成器。

答案 1 :(得分:1)

这可能更多的是风格和偏好而不是其他任何事情,但是......我对文档有不同看法:我总是根据程序上下文中的预期输入编写文档字符串< /强>

示例:如果我编写了一个期望遍历字典键并忽略其值的函数,我写道:

arg : a dictionary of...

即使for e in arg:可以与其他迭代一起使用。我选择这样做,因为在我的代码的上下文中,我不关心函数是否仍然可以工作 ...我更关心那些阅读文档的人是否理解该函数是如何意味着使用

另一方面,如果我正在编写一个可以通过设计处理各种迭代的实用函数,我会采用以下两种方法之一:

  1. 记录在某些条件下会出现什么样的异常 [例如:“如果迭代次数不能多次迭代则提高TypeError”]
  2. 执行一些先发制人的论证处理,这将使该功能与'一次性'迭代相容。
  3. 换句话说,我试图使我的功能足够坚固以处理边缘情况,或者对其局限性非常直言

    再说一遍:你想采取的方法没有任何问题,但我认为这是“explicit is better than implicit”的案例之一:其中提到“可重复使用的可迭代”的文档是明确准确的,但是形容词很容易被忽视。

    HTH!