【问题标题】:How to test if object has a type odict_values in Python3?如何在 Python 中测试对象是否具有 dict_values 类型?
【发布时间】:2020-01-14 09:23:56
【问题描述】:

在一个项目中,我有一个通用函数,它可以将不同的数据类型作为输入数据。在将项目迁移到 Python 3 时,我遇到了 odict_values 的问题。我需要将它们转换为列表,不幸的是,并非所有数据类型都应该转换。所以我决定做这样的事情:

if isinstance(data, odict_values):
    data = list(data)

但我得到一个错误 - 未定义的变量 odict_values。我不明白我应该提供什么作为 isinstance 的第二个参数。如果我使用type(data),我可以清楚地看到<class 'odict_values'>。到目前为止,我想出的最佳解决方案是使用:

str(type(data)) == "<class 'odict_values'>"

但感觉不对。

【问题讨论】:

    标签: python python-3.x types ordereddictionary


    【解决方案1】:

    odict_values 类型无法在内置类型中访问,在 collections 模块中也无法访问。

    这意味着你必须自己定义它:

    from collections import OrderedDict
    odict_values = type(OrderedDict().values())
    

    您可以(并且可能应该)为这种类型使用一个比odict_values 更具描述性的名称。

    但是您可以使用此类型作为isinstance 检查的第二个参数:

    isinstance({1: 1}.values(), odict_values)                   # False
    isinstance(OrderedDict([(1, 1)]).values(), odict_values)    # True
    

    如果您想要一个更通用的测试,如果它是一个映射值的视图(如dictOrderedDict),那么您可以使用抽象基类ValuesView

    from collections.abc import ValuesView
    
    isinstance({1: 1}.values(), ValuesView)                   # True
    isinstance(OrderedDict([(1, 1)]).values(), ValuesView)    # True
    

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 2014-06-03
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2015-09-20
      相关资源
      最近更新 更多