【问题标题】:What is the explicit python3 type for dict_keys for isinstance() check?用于 isinstance() 检查的 dict_keys 的显式 python3 类型是什么?
【发布时间】:2017-10-10 18:16:42
【问题描述】:

在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 行为)但在这种情况下这不是一个选项。 )

【问题讨论】:

  • 您要检查字典键中是否存在值或变量吗?试试这个:&gt;&gt;&gt; d = {1:2} &gt;&gt;&gt; if 1 in d:print("1 is a key")

标签: python python-3.x dictionary key typechecking


【解决方案1】:

使用内置 type():

isinstance(d.keys(), type({}.keys()))

【讨论】:

    【解决方案2】:

    你可以使用collections.abc.KeysView:

    In [19]: isinstance(d.keys(), collections.abc.KeysView)
    Out[19]: True
    

    collections.abc 模块提供抽象基类,可以 用于测试一个类是否提供了特定的接口

    【讨论】:

    • 在python 3.6.3中我可以instanceof(d.keys(), collections.KeysView)(没有abc)
    • @MarkNS DeprecationWarning:不推荐使用或从 'collections' 而不是从 'collections.abc' 导入 ABC,在 3.8 中它将停止工作
    • 对于稍后检查此内容的任何人,FWIW 3.8 日期被推迟,似乎from collections import x 将工作到 python 3.10 (当然会发出警告并且对新代码提出不良建议,请使用collections.abc 代替。
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2021-09-06
    • 2017-07-11
    • 2021-10-22
    • 2011-11-09
    相关资源
    最近更新 更多