← 中文资源

简体中文版本

Python TypeError: NoneType 对象不可下标

通过定位返回 None 的函数并在索引前做防护,修复 TypeError: NoneType 对象不可下标。

阅读英文原文

症状

本篇调试指南针对“Python TypeError: NoneType 对象不可下标”。内容涵盖可观察的症状、可复现的诊断路径、根本原因、具体修复方式,以及如何验证修复并防止回归。

可观察到的症状包括:

  • 在 data[0] 处报 TypeError: NoneType 对象不可下标
  • 该行对某些输入正常,对另一些则失败
  • 某个辅助函数原本返回值,现在返回 None

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

python -X dev -c "import traceback; print(traceback.format_exc())"

失败下标之上的堆栈帧指向返回 None 的调用。

步骤 2

print(repr(data), type(data))

确认值为 None 并由哪个函数产生,可消除猜测。

常见诱因(按出现频率排序):

  • 函数未显式 return,执行到末尾返回 None
  • 未提供默认值的 dict.get(key) 对缺失键返回 None
  • API 调用失败,其错误分支返回 None 而非抛出异常

根因

下标操作会调用 getitem,而 None 未实现该方法。真正的缺陷在上游:某个函数或查找返回了 None,通常源于未显式 return 或使用无默认值的 get()。

修复

在每条代码路径上都显式返回值,使用带真实默认值的 data.get(key, default),并在索引前校验或抛出有意义的错误。

注意:用空容器静默替代 None 会掩盖缺陷;更应在边界处快速失败。

def load_config(raw):          # ❌ falls through -> None
    if raw:
        return raw

cfg = load_config('')          # None
# print(cfg['db'])            # TypeError: 'NoneType' object is not subscriptable

# ✅ explicit fallback
cfg = load_config('') or {}
print(cfg.get('db', 'sqlite:///app.db'))

验证

用此前失败的输入重跑并确认无 TypeError;补充一条测试,断言辅助函数在缺失键时返回容器。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。