Python自定义__getitem__方法读取文件序列无法返回指定索引值求助
问题根因
- 核心错误:
__getitem__方法索引校验通过后直接返回了整个列表self.sequence_list,而非对应索引位置的元素,这是输出全部内容的直接原因 - 逻辑冗余:每次访问索引都会重新遍历文件往列表追加内容,多次调用会导致列表重复膨胀,文件读取&列表初始化逻辑应该放到类的构造方法
__init__中仅执行一次 - 索引逻辑不严谨:默认Python序列为0索引,原代码未适配按“第N个”取数的1索引需求;else分支中
gf>len(self.sequence_list)是无意义的无效语句 - 提示文案格式错误:报错字符串拼接遗漏空格,展示会出现
15quotas这类可读性问题
改造实现
类逻辑调整
将初始化逻辑和索引访问逻辑拆分,支持1索引/0索引切换适配通用场景:
class MultiplicativeSequenceFromFile: def __init__(self, filename, one_index: bool = True): self.filename = filename self.sequence_list = [] # 开关控制是否使用1索引(默认开启,适配取第N个元素的使用习惯) self.one_index = one_index # 初始化时一次性读取文件所有内容,避免重复IO with open(filename, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if line: # 自动跳过文件中的空行 self.sequence_list.append(float(line)) def __getitem__(self, idx): # 索引适配 target_idx = idx - 1 if self.one_index else idx # 合法性校验(和Python原生序列规则保持一致) if 0 <= target_idx < len(self.sequence_list): return self.sequence_list[target_idx] else: print(f"There's only {len(self.sequence_list)} quotas.") raise IndexError(f"Index {idx} out of valid range")
调用侧代码
原有调用逻辑无需修改即可直接使用:
filename = it.input_type(str, "filename = ") gf = myseq.MultiplicativeSequenceFromFile(filename) # 直接取第12个元素,输出结果为1.02 print(f"gf[12] = {gf[12]}")
通用适配说明
如果需要兼容Python原生0索引使用习惯,实例化类时传入one_index=False即可,此时调用gf[11]即可取到第12个元素,和原生列表行为完全一致。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

