在Python3中,我应该使用什么类型来检查字典键是否属于它?
>>> d = {1 : 2}
>>> type(d.keys())
<class 'dict_keys'>
所以我很自然地尝试了这个:
>>> isinstance(d.keys(), dict_keys)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dict_keys' is not defined
我应该用什么来代替显式
dict_keys
作为
isinstance
的第二个参数?
(这很有用,因为我必须处理可以采用字典键形式的未知输入变量。而且我知道使用
list(d.keys())
可以转换为列表(恢复 Python2 行为),但在这种情况下这不是一个选项。 )
在 Python 3 中,你不应该直接使用
dict_keys
进行
isinstance
检查。这是因为
dict.keys()
返回的对象是字典视图,而不是特定的类型。
你可以使用
typing.KeysView
来进行类型提示,但在运行时进行类型检查时,你应该检查它是否为
collections.abc.KeysView
的实例:
from collections.abc import KeysView
d = {1: 2}
keys = d.keys()
if isinstance(keys, KeysView):
print("It's a dictionary keys view!")
以下是原因:
-
dict_keys
的动态性:dict_keys
的实际类型在 Python 3 的不同版本中可能会发生变化,因此直接检查它不是面向未来的解决方案。 -
鸭子类型:
通常,在 Python 中,我们更关心一个对象的行为而不是它的确切类型(“如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那么它就是一只鸭子”)。如果你需要确保你的代码可以处理一个类似于字典视图的对象,那么检查它是否为
collections.abc.KeysView
的实例应该足够了。
请记住,字典视图是动态的,反映了字典的变化。如果你需要一个稳定的键列表,你可以随时使用
list(d.keys())
将其转换为列表。