gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:10:04 26 4
gpt4 key购买 nike

运行这个:

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 <module>
list(DontList())
File "list.py", line 4, in __getitem__
if key == 10: raise KeyError("You get the idea.")
KeyError: 'You get the idea.'

我怎样才能更改它以便获得 [],同时仍然允许访问那些 key [1] 等?

(我试过输入 def __length_hint__(self): return 0,但没有用。)

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

申请后a certain patch为了 iniparse,我发现我的补丁有一个令人讨厌的副作用。在我的 Undefined 类上设置了 __getattr__,它返回一个新的 Undefined 对象。不幸的是,这意味着 list(iniconfig.invalid_section)(其中 isinstance(iniconfig, iniparse.INIConfig))正在执行此操作(放入简单的 print__getattr____getitem__ 中):

Getting attr __length_hint__
Getting item 0
Getting item 1
Getting item 2
Getting item 3
Getting item 4

等等等等。

最佳答案

如果你想覆盖迭代,那么只需在你的类中定义 __iter__ 方法

关于python - 如何覆盖 Python 列表(迭代器)行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4256357/

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