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

博客探讨了如何自定义Python类的行为,特别是当它与内置的列表操作交互时。作者遇到的问题是,一个名为`DontList`的类在尝试被转化为列表时,触发了无限循环。`__getattr__`和`__getitem__`方法被设置以返回新的`Undefined`对象,导致了意外的`KeyError`。解决方案旨在允许`DontList`实例能够被转化为空列表,同时保持对特定键的访问能力。
摘要由CSDN通过智能技术生成

运行这个:

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())

产生这个:

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

list(DontList())

File "list.py", line 4, in __getitem__

if key == 10: raise KeyError("You get the idea.")

KeyError: 'You get the idea.'

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

(我已尝试输入def __length_hint __(self):返回0,但它没有帮助.)

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

将a certain patch应用于iniparse之后,我发现了一个令人讨厌的副作用.在我的Undefined类上设置了__getattr__,它返回一个新的Undefined对象.不幸的是,这意味着list(iniconfig.invalid_section)(其中isinstance(iniconfig,iniparse.INIConfig))正在执行此操作(在__getattr__和__getitem__中放入简单的打印件):

Getting attr __length_hint__

Getting item 0

Getting item 1

Getting item 2

Getting item 3

Getting item 4

等等无限.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值