gpt4 book ai didi

python - 是文件对象迭代器 "broken?"

转载 作者:太空狗 更新时间:2023-10-29 18:29:21 27 4
gpt4 key购买 nike

根据documentation :

Once an iterator’s __next__() method raises StopIteration, it must continue to do so on subsequent calls. Implementations that do not obey this property are deemed broken.

但是,对于文件对象:

>>> f = open('test.txt')
>>> list(f)
['a\n', 'b\n', 'c\n', '\n']
>>> next(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> f.seek(0)
0
>>> next(f)
'a\n'

文件对象迭代器是否损坏?这是否只是无法修复的事情之一,因为它会破坏太多依赖它的现有代码?

最佳答案

我认为,如果有的话,那是该段落的文档错误,而不是 io 对象中的错误。 (而且 io 对象并不是唯一的东西——最简单的是,文件周围的 csv.reader 包装器就像文件一样可以重新启动。)

如果您只是将迭代器用作迭代器,一旦它引发,它将继续引发。但是,如果您在迭代器协议(protocol)之外调用方法,那么您实际上不再将其用作迭代器,而是用作不仅仅是迭代器的东西。在那种情况下,如果有意义的话,对象是“可再填充的”似乎是合法的,甚至是惯用的。只要它在作为迭代器嘎嘎作响时从不重新填充自己,只有在它作为其他某种超出此范围的类型嘎嘎作响时才进行 self 填充。

在 C++ 中的类似情况下,语言委员会很可能会声明这破坏了可替换性,因此一旦您在其上调用这样的方法,迭代器就作为迭代器变得无效,即使语言不能强制执行。或者为可再填充迭代器提出一个全新的协议(protocol)。 (当然,C++ 迭代器与 Python 迭代器并不完全相同,但希望您明白我的意思。)

但在 Python 中,实用胜于纯粹。我很确定 Guido 从一开始就打算这样做,一个对象被允许这样做并且仍然被认为是一个迭代器,核心开发人员继续打算这样做,只是没有人考虑过如何编写一些东西足够严格以准确解释它,因为没有人问过。

如果您通过提交文档错误来提问,我敢打赌这一段会得到一个脚注,而不是 io 和其他可重新填充的迭代器对象被重新分类为实际上不是迭代器。

关于python - 是文件对象迭代器 "broken?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51862462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com