自定义__getitem__方法的类实例参数解包时程序永不终止问题
代码运行逻辑与异常原因分析
涉及代码
class A: def __getitem__(self, key): return 1 print(*A())
底层运行逻辑
- 执行
print(*A())时,*运算符会尝试对A类的实例做可迭代对象解包,把解包得到的所有元素作为位置参数传入print函数。 - Python对自定义类实例做迭代/解包操作时,优先查找类是否实现了
__iter__方法;如果没有实现该方法,会自动降级为使用__getitem__方法实现迭代逻辑:迭代时会从整数索引0开始,依次调用__getitem__(0)、__getitem__(1)、__getitem__(2)……直到方法抛出IndexError或StopIteration异常,才会终止迭代。 - 本例中类
A的__getitem__方法无论接收的key参数是什么值,都会固定返回整数1,全程不会抛出任何异常。
程序无法正常结束的原因
基于上述迭代规则,解包A实例的过程会无限调用__getitem__方法,索引值从0开始无限递增,永远不会触发迭代终止的条件,程序直接进入死循环,无法推进到print的执行步骤,自然也无法正常结束运行。
内容的提问来源于stack exchange,提问作者kosciej16
相关产品推荐
相关产品推荐

