繁体   English   中英

Python __getitem__ 和 in 运算符导致奇怪的行为

[英]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 f5 in f测试使用infor的默认回退,导致观察到的行为。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM