故障表现

边遍历边删掉值为空的键,循环刚执行几次就抛运行时错误,脚本中断。

问题出在哪

迭代器按原字典长度推进,中途删除导致长度变化,解释器直接拒绝继续。判断时先分清是 字典遍历时修改 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

按这个顺序处理

  1. 先收集要删的键再统一删除
  2. 或用字典推导式生成新字典
  3. 不要在循环体内直接 pop

对应的命令或配置片段如下,可直接复制:

d = {'a': 1, 'b': None, 'c': 3}
for k in [k for k, v in d.items() if v is None]:
    d.pop(k)
print(d)
# 或者
d = {k: v for k, v in d.items() if v is not None}

不要一次改多个参数,每次只动一处并记录下来,否则现象变了也说不清是哪个改动起的作用。改完只在一台机器上验证不够,至少从外网和移动网络各试一次,才能确认不是本地缓存造成的假象。

怎么确认改好了

处理后字典只剩有效键,遍历不再报错,后续逻辑正常执行。

作者 9823189