使用自定义 __getitem__ 方法解包参数永远不会终止

use*_*462 4 python

有人可以解释一下幕后发生了什么以及为什么这个程序没有完成吗?

class A:
    def __getitem__(self, key):
        return 1

print(*A())
Run Code Online (Sandbox Code Playgroud)

jua*_*aga 7

该程序无法完成,因为您定义的类是可迭代的,使用旧的序列迭代协议。基本上,__getitem__使用从 0, ..., n 递增的整数调用,直到IndexError提出 an 为止。

>>> class A:
...     def __getitem__(self, key):
...         return 1
...
>>> it = iter(A())
>>> next(it)
1
>>> next(it)
1
>>> next(it)
1
>>> next(it)
1
Run Code Online (Sandbox Code Playgroud)

您正在解压一个无限迭代器,因此最终您将耗尽内存。

来自iter文档:

如果没有第二个参数,object 必须是支持迭代协议(方法__iter__())的集合对象,或者它必须支持序列协议(__getitem__()整数参数从 0 开始的方法)。如果它不支持这些协议中的任何一个,则会引发 TypeError。