应优先使用isinstance()进行日常类型校验,因其支持继承关系和元组多类型判断;type()适用于精确匹配调试;dir()用于探查对象属性与方法。

检测数据结构类型不能只靠一眼判断,得结合目的选方法:日常校验用 isinstance(),调试溯源看 type(),复杂对象则要借助 dir() 和属性观察。没有万能函数,关键在分场景用对工具。
基础类型识别:优先用 isinstance()
这是最稳妥的类型检查方式,支持继承关系,也兼容元组形式的多类型判断。
- 检查单个类型:
isinstance(data, list)或isinstance(data, dict) - 允许多选类型:
isinstance(data, (list, tuple, set))返回 True 表示是三者之一 - 适合函数入口校验,比如要求参数必须是序列类型,就写
if not isinstance(seq, (list, tuple)):然后抛错或提示
精确类型匹配:用 type() 辅助调试
当需要区分“是不是这个类本身”,而非“是不是它的子类”时,type() 更准确。它不认继承,只看真实构造类。
-
type(obj) is list只对原生列表返回 True,自定义类继承 list 的实例会返回 False - 调试时常用:
print(type(data))快速确认实际类型,尤其面对第三方库返回的对象 - 不建议用于逻辑分支判断,除非明确需要排除子类行为
深入结构探查:dir() 与 __class__ 结合看
遇到自定义对象、封装类或不确定来源的数据(如 API 返回值),仅靠类型名不够,需观察其能力边界。
-
dir(obj)列出所有可用属性和方法,比如看到'keys'和'items'就大概率是字典行为 -
obj.__class__显示具体类路径,<class 'pandas.core.series.Series'>比单纯说“像 list”更有价值 - 组合使用:
if 'read' in dir(obj) and callable(getattr(obj, 'read', None)):可判断是否具备文件类接口
工程级健壮检查:类型注解 + mypy 静态验证
运行时检查只是兜底,真正降低风险要靠提前约束。Python 类型注解配合 mypy 能在编码阶段发现问题。
- 函数签名加提示:
def process(items: list[str]) -> dict[str, int]: - 安装并运行:
pip install mypy && mypy script.py,自动报出类型不匹配位置 - IDE 实时反馈补全更准,重构更安全,尤其适合团队协作和长期维护项目

















