如何在Python中正确检查对象类型?
问题:我需要检查一个返回的值是否是一个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.
在大多数情况下,这其实就是“什么都不做”。
只管写代码。如果“某种方式”有个恶意的人用了错误的数据类型,程序就会像预期那样崩溃。