如何在Python中正确检查对象类型?
问题:我必须检查a返回值是否是Python字典 问题1。以下哪个选项是正确的方法如何在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实例,
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个元素。:)