3 回答
TA贡献1876条经验 获得超5个赞
如果查看定义迭代器的PEP234,它会显示:
1. An object can be iterated over with "for" if it implements
__iter__() or __getitem__().
2. An object can function as an iterator if it implements next().
TA贡献1951条经验 获得超3个赞
对迭代的支持__getitem__
可以看作是“旧版功能”,当PEP234将可迭代性作为主要概念引入时,它可以更平滑地过渡。它仅适用于类,而__iter__
其__getitem__
接受整数0,1,&C,并提出IndexError
一旦指数过高(如果有的话),典型的“序列”类编码之前__iter__
出现(虽然没有从编码新类也以此方式阻止你)。
就我个人而言,我不希望新代码中不依赖于此,尽管它既不被弃用也不消失(在Python 3中也可以正常工作),所以这只是样式和口味的问题(“显式优于隐式”)我宁愿显式地支持可迭代性,而不是依靠对__getitem__
我隐式地支持它-但不是很大)。
TA贡献1829条经验 获得超7个赞
__getitem__
早于迭代器协议,并且在过去是使事物可迭代的唯一方法。因此,仍然支持它作为迭代方法。本质上,迭代协议是:
检查
__iter__
方法。如果存在,请使用新的迭代协议。否则,请尝试
__getitem__
使用连续较大的整数值进行调用,直到引发IndexError。
(2)曾经是实现此目的的唯一方法,但缺点是它假设需要更多的资源来支持迭代。为了支持迭代,您必须支持随机访问,这对于文件或网络流之类的东西来说要昂贵得多,因为向前访问很容易,但是向后走则需要存储所有内容。 __iter__
允许没有随机访问的迭代,但是由于随机访问通常无论如何都允许迭代,并且由于破坏向后兼容性会很糟糕,__getitem__
因此仍受支持。
添加回答
举报