TypeError报错必须从最底部定位,明确操作、类型及原因;跳过第三方路径,聚焦自有代码文件和行号;检查上下文变量赋值、分支逻辑、函数返回值;用print(type(), repr())验证真实类型;按字符串拼接、不可调用对象、字典列表误用等典型场景修复。

直接看traceback最底部那行
TypeError报错必须立刻定位,不能跳过。滚动终端输出到最底下,找到形如TypeError: can only concatenate str (not "int") to str这样的最后一行——它不是提示,是判决书。这一行明确告诉你:什么操作失败、涉及哪两个类型、为什么不行。
往上翻时,**跳过所有site-packages/、lib/python3.x/开头的路径**,只盯住你自己写的.py文件名和行号,比如File "utils.py", line 42, in parse_config。打开这个文件,跳转到第42行,但别只看这一行。
- 向上看两行:检查变量是否被赋值过,有没有可能在某个分支里没走通就到了这里
- 向下看一行:确认当前行是否在
if或for块内,导致某次循环时数据为空或类型突变 - 特别注意函数调用返回值:比如
json.loads()失败会返回None,而不是dict;list.sort()返回None,不是排序后的新列表
用print(type())和repr()验证真实类型
别猜,直接打出来。在报错行正上方加一句print(type(x), repr(x)),比如print(type(data), repr(data))。比str()更可靠的是repr(),它能清晰显示None、空字典{}、空列表[],甚至不可见字符。
如果输出是<class 'NoneType'>,说明上游逻辑根本没走通,别急着改当前行,先查前面的if分支、异常捕获是否吞掉了错误,或者API返回是否异常。
立即学习“Python免费学习笔记(深入)”;
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
-
type(x)告诉你“它是什么”,repr(x)告诉你“它到底长什么样” - 对字典键操作前,先
print(list(data.keys()))确认键是否存在 - 对列表索引前,先
print(len(my_list))确认长度够不够
按典型场景快速修复
大部分TypeError都集中在几个固定模式,对应修法很明确:
- 字符串拼接数字 → 改成
"年龄:" + str(age)或f"年龄:{age}",不要依赖隐式转换 - 调用不可调用对象 → 检查是不是写了
my_list.sort()又跟了(),改成my_list.sort()(无括号)或换用sorted(my_list) - 字典当列表用 →
data[0]报错但data是dict?改用list(data.values())[0]或data.get("key", "default") - 传参类型错位 → 比如
len(123)报错,是因为len()只接受序列,换成len(str(123))或确认输入源是否该是字符串
所有类型转换前必须确认变量不为None,否则int(None)会引发新TypeError。
别忽略上游空值和默认行为
很多TypeError表面在A行,根子在B行的默认返回或异常处理里。比如函数定义末尾没写return,Python默认返回None;或者try/except里只pass,吞掉原始错误后下游拿到None再操作就崩。
还有像dict.pop(key)没给默认值、re.search()匹配失败返回None,这些都容易让下游代码在毫无预警的情况下拿到None,一做属性访问或调用就触发TypeError。
真正难排查的,往往不是拼错类型,而是那个没人想到会是None的变量。

















