如何测试对象是否在 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
如果你想要一个更一般的测试,如果它是一个映射值的视图(比如 dict
和 OrderedDict
),那么你可以使用抽象基础 class ValuesView
:
from collections.abc import ValuesView
isinstance({1: 1}.values(), ValuesView) # True
isinstance(OrderedDict([(1, 1)]).values(), ValuesView) # True
在一个项目中,我有一个通用函数,它可以将不同的数据类型作为输入数据。在将项目迁移到 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
如果你想要一个更一般的测试,如果它是一个映射值的视图(比如 dict
和 OrderedDict
),那么你可以使用抽象基础 class ValuesView
:
from collections.abc import ValuesView
isinstance({1: 1}.values(), ValuesView) # True
isinstance(OrderedDict([(1, 1)]).values(), ValuesView) # True