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

如何在Python中正确检查对象类型?,python,types,comparison,isinstance,Python,Types,Comparison,Isinstance,问题:我必须检查a返回值是否是Python字典 问题1。以下哪个选项是正确的方法 type(x) == dict type(x) == type(dict) isinstance(d, dict) 然后还有使用is运算符而不是=的其他变体 问题2。假设检查对象的类型通常是一种不好的做法,但是关于我最初的问题,我还有其他选择吗?检查\uuu getitem\uuuuuuu而不是验证类型。如果您真的想进行类型检查,那么any都可以(除了type(x)==type(dict),对于dict实例,

问题:我必须检查a返回值是否是Python字典

问题1。以下哪个选项是正确的方法

type(x) == dict

type(x) == type(dict)

isinstance(d, dict)
然后还有使用
is
运算符而不是
=
的其他变体


问题2。假设检查对象的类型通常是一种不好的做法,但是关于我最初的问题,我还有其他选择吗?

检查
\uuu getitem\uuuuuuu
而不是验证类型。如果您真的想进行类型检查,那么any都可以(除了
type(x)==type(dict)
,对于
dict
实例,这永远不会是真的)
isinstance
可能是最标准的方法

问题1。以下哪个选项是正确的方法

type(x) == dict

type(x) == type(dict)

isinstance(d, dict)
不要把时间浪费在类型检查上

它很容易出错,因为它是基于假设的

问题2。。。我还有别的选择吗

是的,做这个

try:
    x.the_dict_operation()
except TypeError:
    # x was not the expected type for the operation
    raise # or whatever.
在大多数情况下,这相当于“无所事事”

只需编写代码。如果恶意反社会者“不知何故”使用了错误的类型,它将像预期的那样崩溃。

依赖于行为,而不是实际类型(参见其他答案)

很多对象可以像字典一样工作,你不想强迫函数/API的用户使用普通dict,对吗

在务实方面:

>>> type({})
<type 'dict'>
>>> dict
<type 'dict'>
>>> type(dict)
<type 'type'>
>>> isinstance({}, dict)
True
>>> isinstance("", dict)
False
>>类型({})
>>>口述
>>>类型(dict)
>>>isinstance({},dict)
真的
>>>isinstance(“,dict)
假的

您需要它成为一本词典还是需要访问其中的项目?不管怎样,您链接的问题已经提供了答案。@Garet我需要成为一本词典,因为我将使用它来更新另一条格言。@Garet很抱歉,我错过了。但是,我的问题2没有涉及。如果您确实需要检查类型,Python文档会告诉您使用
isinstance
而不是
type
,并说使用
isinstance
和抽象基类(来自集合、数字、io)来查看对象是否支持特定接口。+1非常感谢,现在我真正理解了什么“Duck typing”是关于。这样,我必须相信x.dict\u操作方法仍然做它应该做的事情(在我的例子中是另一个字典的简单的.update)。这不是一个潜在的问题吗?@Guandalino:因为你使用用户提供的dict来更新你自己的dict,你自己的dict的
.update()
方法正在被调用。如果你不能信任它…让它崩溃并修复代码,而不是进行大量检查。我认为这是一个很好的做法。@Guandalino:“这样我就必须信任…”还有什么选择?神奇的内省以“某种方式”断言“代码无缺陷,满足原始设计中所有“要求”和“保证”条款中的所有合同规范?除了信任之外,没有任何其他可能的方法。
\uuuu getitem\uuuuuuuuu
与dict没有任何关系。许多对象都有不属于dict的
\uuuu getitem\uuuuuuu
。对于他正在做的事情(检查对象是否可以传递给
{}.update
),这尤其是错误的:有些对象可以传递给该函数,但这些对象没有
\uuu getitem\uuuu
。他想检查对象是否是可iterable。@Glenn它需要是可iterable的,这样迭代的元素都是可iterable的,这样每个元素中都有2个元素。:)