You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义Stack类继承后调用__getitem__切片报KeyError问题

故障原因

  • 切片操作触发__getitem__方法后,执行的self.__class__(self.items[slc])逻辑中,self.__class__对应的是子类SpecificStack而非父类Stack,因此会调用SpecificStack的构造方法初始化切片后的新对象。
  • 切片得到的self.items[slc]是已经完成结构化处理的字典列表,每个元素都是{'time': xx, 'place': xx, 'order': xx}格式的字典,但SpecificStack的__init__要求传入的是原始嵌套数值列表(每个子元素为长度为3的数值列表),构造逻辑里会通过d[0]、d[1]、d[2]读取子元素的对应数值。
  • 当构造方法接收到字典列表后,循环取d[0]时,字典不存在整数类型的键,因此直接抛出KeyError。

可选修复方案

如果需要保留切片返回子类实例的逻辑,可以修改SpecificStack的构造方法,兼容已处理好的字典列表输入:

class SpecificStack(Stack):
  def __init__(self, some_data):
    super().__init__()
    # 兼容已经结构化的字典列表输入
    if some_data and isinstance(some_data[0], dict):
        self.items = some_data
        return
    for d in some_data:
       item = {'time': d[0], 'place': d[1], 'order': d[2]}
       self.append( item )

如果不需要切片返回子类实例,也可以直接修改父类__getitem__的切片返回逻辑,固定返回Stack实例:

# 父类Stack的__getitem__修改
def __getitem__(self, slc):
    if isinstance(slc, int):
      return self.items[slc]
    else:
      # 固定返回Stack实例,不随子类变化
      return Stack(self.items[slc])

内容的提问来源于stack exchange,提问作者Ignas Nevinskas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 22:27:03