Python文档:可迭代对象多次使用?

6
在记录Python函数时,我发现更符合Pythonic的做法是这样说:
def Foo(i):
    """i: An interable containing…"""

…而不是…

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

i 不需要是一个列表时。(Foo 可以愉快地在 settuple 等上操作。)问题出在生成器上。生成器通常只允许一次迭代。大多数函数可以接受只允许单次遍历的生成器或可迭代对象,但有些函数则不行。
对于那些不能接受生成器/只能迭代一次的东西的函数,是否有一个清晰、一致的 Python 术语来表示“只能被迭代多次的东西”?
Python 词汇表中 iterableiterator 看起来都有“一次,但如果你幸运的话可能会再次迭代”的定义。

1
“集合”?这似乎描述了这里的所有示例类型。 - ephemient
对于容器的使用加1,这似乎以最简洁的方式捕捉了基本思想,但是...我不认为我在任何Python文档中看到过“container”这个词? - Richard Levasseur
1
一个容器是一个带有__contains __()方法的对象,这个方法既不是可重用迭代器所必需的,也不足够。http://docs.python.org/library/collections.html#collections.Container - Michael Hoffman
2个回答

2

我不知道这个标准术语,至少一时半会儿想不到,但是如果你需要一个简短的短语来表达,"可重用的可迭代对象"可能会让人明白。

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


1
请注意,正如文档中指出的那样,“通常情况下,如果一个迭代器在另一个迭代器开始之前使用了大部分或全部数据,则使用list()比使用tee()更快。” 在这种情况下,tee()将多次复制/存储内容,而list()只会存储一次。 - waterproof

1

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

例如:如果我编写了一个函数,希望遍历字典的键并忽略其值,我会这样写:

arg : a dictionary of...

即使for e in arg:可以与其他可迭代对象一起使用,但我选择这样做,因为在我的代码上下文中,我不关心函数是否仍然有效...我更关心阅读文档的人了解该函数的正确使用方式。

另一方面,如果我正在编写一个可以通过设计应对广泛迭代器的实用函数,则采用以下两种方式之一:

  1. 记录在某些条件下会引发何种异常[例如:"如果可迭代对象无法多次迭代,则引发TypeError"]
  2. 执行一些预先处理参数,使函数与“一次性”可迭代对象兼容。

换句话说,我尝试使我的函数足够稳定以处理边缘情况,或者非常明确地说明其限制

再次强调:你想采取的方法没有问题,但我认为这是“显性优于隐性”的例子之一:提到“可重用的可迭代对象”的文档确实是准确的,但形容词很容易被忽视。

希望对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接