如何覆盖Python列表(迭代器)行为?

Chr*_*gan 6 python

运行这个:

class DontList(object):
    def __getitem__(self, key):
        print 'Getting item %s' % key
        if key == 10: raise KeyError("You get the idea.")
        return None

    def __getattr__(self, name):
        print 'Getting attr %s' % name
        return None

list(DontList())
Run Code Online (Sandbox Code Playgroud)

产生这个:

Getting attr __length_hint__
Getting item 0
Getting item 1
Getting item 2
Getting item 3
Getting item 4
Getting item 5
Getting item 6
Getting item 7
Getting item 8
Getting item 9
Getting item 10
Traceback (most recent call last):
  File "list.py", line 11, in <module>
    list(DontList())
  File "list.py", line 4, in __getitem__
    if key == 10: raise KeyError("You get the idea.")
KeyError: 'You get the idea.'
Run Code Online (Sandbox Code Playgroud)

我怎样才能改变这一点,以便我可以获得[],同时仍允许访问这些键[1]等?

(我试过投入def __length_hint__(self): return 0,但没有帮助.)

我的真实用例:(如果它有用的话,请仔细阅读;随意忽略这一点)

在将某个补丁应用到iniparse之后,我发现了一个令人讨厌的副作用.已经__getattr__在我的设置Undefined类,它返回一个新的Undefined对象.不幸的是,这意味着list(iniconfig.invalid_section)(where isinstance(iniconfig, iniparse.INIConfig))正在这样做(print__getattr__和中放入简单的s __getitem__):

Getting attr __length_hint__
Getting item 0
Getting item 1
Getting item 2
Getting item 3
Getting item 4
Run Code Online (Sandbox Code Playgroud)

等等无限.

Jak*_*yer 7

如果要覆盖迭代,则只需__iter__在类中定义方法即可