3

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

Q1。这些选项中的哪一个是执行此操作的正确方法?

type(x) == dict

type(x) == type(dict)

isinstance(d, dict)

然后还有其他变体使用isoperator 而不是==.

Q2。很多人说检查对象的类型通常是一种不好的做法,但是对于我最初的问题,我还有其他选择吗?

4

3 回答 3

8

Q1。这些选项中的哪一个是执行此操作的正确方法?

不要在类型检查上浪费时间。

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

Q2。……我还有别的选择吗?

是的,这样做。

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

在大多数情况下,这相当于“什么都不做”。

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

于 2011-08-01T23:31:30.543 回答
2

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

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

在务实方面:

>>> type({})
<type 'dict'>
>>> dict
<type 'dict'>
>>> type(dict)
<type 'type'>
>>> isinstance({}, dict)
True
>>> isinstance("", dict)
False
于 2011-08-01T23:38:48.020 回答
1

检查__getitem__而不是验证类型。如果您真的想进行类型检查,那么 any 都可以(好吧,除了type(x) == type(dict),例如,这永远不会成立dict)。isinstance可能是最标准的方法。

于 2011-08-01T23:31:04.950 回答