[英]Python __getitem__ and in operator result in strange behavior
什么解释了以下行为:
class Foo:
def __getitem__(self, item):
print("?")
return 1
f = Foo()
1 in f # prints one ? and returns True
5 in f # prints ? forever until you raise a Keyboard Exception
# Edit: eventually this fails with OverflowError: iter index too large
如果一个对象不具有__contains__
实施, in
倒在一个默认的,基本上是这样的:
def default__contains__(self, element):
for thing in self:
if thing == element:
return True
return False
如果一个对象没有__iter__
实现,则for
回退到一个基本上像这样工作的默认值:
def default__iter__(self):
i = 0
try:
while True:
yield self[i]
i += 1
except IndexError:
pass
即使对象不是一个序列,也会使用这些默认值。
您的1 in f
和5 in f
测试使用in
和for
的默认回退,导致观察到的行为。 1 in f
立即找到1
,但你的__getitem__
永远不会返回5
,所以5 in f
永远运行。
(好吧,实际上,在 Python 的参考实现中,默认的__iter__
回退将索引存储在Py_ssize_t
类型的 C 级变量中,因此如果您等待的时间足够长,该变量将达到最大值并且Python 会引发 OverflowError 。如果您看到了,您必须使用 32 位 Python 版本。计算机的存在时间还不够长,任何人都无法在 64 位 Python 上使用它。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.