如何在Python中正确检查对象类型?

3 投票
3 回答
6467 浏览
提问于 2025-04-16 22:41

问题:我需要检查一个返回的值是否是一个Python字典。

问题1:下面这些选项中,哪一种是正确的做法呢?

type(x) == dict

type(x) == type(dict)

isinstance(d, dict)

还有其他一些变体是使用 is 操作符,而不是 ==

问题2:很多人说检查一个对象的类型通常不是个好习惯,但针对我最开始的问题,我还有其他选择吗?

3 个回答

1

检查一个对象是否有 __getitem__ 这个方法,而不是单纯地确认它的类型。如果你真的想检查类型,使用 any 也可以(不过,type(x) == type(dict) 这种写法是没用的,因为这永远不会对一个 dict 实例成立)。通常来说,使用 isinstance 是最标准的做法。

2

依赖于行为,而不是实际的类型(可以参考其他回答)。

很多对象可以表现得像字典,你不想强迫使用你函数/API 的人只能使用普通的字典,对吧?

从实际的角度来看:

>>> type({})
<type 'dict'>
>>> dict
<type 'dict'>
>>> type(dict)
<type 'type'>
>>> isinstance({}, dict)
True
>>> isinstance("", dict)
False
8

问1:这些选项中,哪个是正确的做法?

别浪费时间去检查数据类型。

这样做容易出错,因为你是在根据假设来判断。

问2:...我还有其他选择吗?

有的,按照这个做。

try:
    x.the_dict_operation()
except TypeError:
    # x was not the expected type for the operation
    raise # or whatever.

在大多数情况下,这其实就是“什么都不做”。

只管写代码。如果“某种方式”有个恶意的人用了错误的数据类型,程序就会像预期那样崩溃。

撰写回答