Mat*_*sen 34 python python-3.x
什么解释了以下行为:
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
Run Code Online (Sandbox Code Playgroud)
use*_*ica 45
如果一个对象没有__contains__
实现,则in
返回到一个基本上像这样工作的默认值:
def default__contains__(self, element):
for thing in self:
if thing == element:
return True
return False
Run Code Online (Sandbox Code Playgroud)
如果一个对象没有__iter__
实现,则for
返回到一个基本上像这样工作的默认值:
def default__iter__(self):
i = 0
try:
while True:
yield self[i]
i += 1
except IndexError:
pass
Run Code Online (Sandbox Code Playgroud)
即使对象不是一个序列,也会使用这些默认值。
你1 in f
和5 in f
测试使用的是默认的回退in
和for
,导致观察到的行为。立即1 in f
找到1
,但您__getitem__
永远不会返回5
,因此5 in f
永远运行。
(嗯,实际上,在 Python 的参考实现中,默认__iter__
回退将索引存储在 C 级变量中Py_ssize_t
,因此如果您等待的时间足够长,该变量将达到最大值并且Python 会引发一个 OverflowError。如果您看到了,您必须在 32 位 Python 版本上。计算机的存在时间还不够长,任何人都无法在 64 位 Python 上使用它。)
归档时间: |
|
查看次数: |
1102 次 |
最近记录: |