为什么在类上定义__getitem__使其在python中可迭代?

为什么在类上定义__getitem__使其可迭代?


例如,如果我写:


class b:

  def __getitem__(self, k):

    return k


cb = b()


for k in cb:

  print k

我得到的输出:


0

1

2

3

4

5

6

7

8

...

我真的希望看到从“ for c in kb”返回的错误:


RISEBY
浏览 740回答 3
3回答

慕运维8079593

如果查看定义迭代器的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().

饮歌长啸

对迭代的支持__getitem__可以看作是“旧版功能”,当PEP234将可迭代性作为主要概念引入时,它可以更平滑地过渡。它仅适用于类,而__iter__其__getitem__接受整数0,1,&C,并提出IndexError一旦指数过高(如果有的话),典型的“序列”类编码之前__iter__出现(虽然没有从编码新类也以此方式阻止你)。就我个人而言,我不希望新代码中不依赖于此,尽管它既不被弃用也不消失(在Python 3中也可以正常工作),所以这只是样式和口味的问题(“显式优于隐式”)我宁愿显式地支持可迭代性,而不是依靠对__getitem__我隐式地支持它-但不是很大)。

吃鸡游戏

__getitem__早于迭代器协议,并且在过去是使事物可迭代的唯一方法。因此,仍然支持它作为迭代方法。本质上,迭代协议是:检查__iter__方法。如果存在,请使用新的迭代协议。否则,请尝试__getitem__使用连续较大的整数值进行调用,直到引发IndexError。(2)曾经是实现此目的的唯一方法,但缺点是它假设需要更多的资源来支持迭代。为了支持迭代,您必须支持随机访问,这对于文件或网络流之类的东西来说要昂贵得多,因为向前访问很容易,但是向后走则需要存储所有内容。 __iter__允许没有随机访问的迭代,但是由于随机访问通常无论如何都允许迭代,并且由于破坏向后兼容性会很糟糕,__getitem__因此仍受支持。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python