如何测试对象是否在 Python3 中具有类型 odict_values?

How to test if object has a type odict_values in Python3?

在一个项目中,我有一个通用函数,它可以将不同的数据类型作为输入数据。在将项目迁移到 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'>"

但感觉不对

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),那么你可以使用抽象基础 class ValuesView:

from collections.abc import ValuesView

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