不能对 dict_keys / dict_values / dict_items 进行“类型是”测试吗?

RBV*_*RBV 4 python-3.x

是否可以使用“type is”语句测试 Python 3 的dict_keysdict_valuesdict_items内置类型?

很容易获得给定的内置类型(在本例中为float):

>>> type(4.5)
<class 'float'>
Run Code Online (Sandbox Code Playgroud)

并使用“type is”语句来测试其类型:

>>> type(4.5) is float
True
>>> type(4.5) is int
False
Run Code Online (Sandbox Code Playgroud)

现在我将创建一个简单的 Python 字典:

simpleDict = {
    'firstKey' : 'firstValue',
    'secondKey' : 'secondValue',
    }
Run Code Online (Sandbox Code Playgroud)

很容易列出字典的 或在这个例子中的项目

>>> simpleDict.items()
dict_items([('secondKey', 'secondValue'), ('firstKey', 'firstValue')])
Run Code Online (Sandbox Code Playgroud)

并获取该字典的dict_内置类型之一的类型:

>>> type(simpleDict.items())
<class 'dict_items'>
Run Code Online (Sandbox Code Playgroud)

但是现在我不知道如何使用“type is”语句来测试该内置类型:

>>> type(simpleDict.items()) is dict_items
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'dict_items' is not defined
Run Code Online (Sandbox Code Playgroud)

我不需要这样做的实际原因,我只是好奇为什么dict内置类型被报告为“未定义”,因此显然不可测试(?)与“类型是”测试。

Zen*_*din 5

正如 Padraic Cunningham 在评论中所说,您可以使用以下测试来检查 dict_items 是否相等:

>>> type(simpleDict.items()) is {}.items().__class__
True
Run Code Online (Sandbox Code Playgroud)

这也适用于keys()values()

>>> type(simpleDict.keys()) is {}.keys().__class__
True
>>> type(simpleDict.values()) is {}.values().__class__
True
Run Code Online (Sandbox Code Playgroud)

通常,要对类执行“类型是”测试,请初始化该类的一个空对象,并获取__class__该对象的成员以用于比较。