51

如何检查对象是否是Named tuple的实例?

4

7 回答 7

52

调用该函数 collections.namedtuple会为您提供一个新类型,它是tuple(并且没有其他类)的子类,其中有一个名为_fields该成员的成员,该成员是一个元组,其项目都是字符串。因此,您可以检查以下每一项:

def isnamedtupleinstance(x):
    t = type(x)
    b = t.__bases__
    if len(b) != 1 or b[0] != tuple: return False
    f = getattr(t, '_fields', None)
    if not isinstance(f, tuple): return False
    return all(type(n)==str for n in f)

有可能从中得到误报,但前提是有人不遗余力地制作一种看起来很像命名元组但不是命名元组的类型;-)。

于 2010-01-30T04:21:18.073 回答
29

如果要确定一个对象是否是特定命名元组的实例,可以这样做:

from collections import namedtuple

SomeThing = namedtuple('SomeThing', 'prop another_prop')
SomeOtherThing = namedtuple('SomeOtherThing', 'prop still_another_prop')

a = SomeThing(1, 2)

isinstance(a, SomeThing) # True
isinstance(a, SomeOtherThing) # False
于 2016-12-29T00:28:07.930 回答
5

3.7+

def isinstance_namedtuple(obj) -> bool:
    return (
            isinstance(obj, tuple) and
            hasattr(obj, '_asdict') and
            hasattr(obj, '_fields')
    )

于 2020-07-02T08:56:04.853 回答
4

如果您需要在调用 namedtuple 特定函数之前进行检查,那么只需调用它们并捕获异常即可。这是在 python 中执行此操作的首选方式。

于 2010-01-30T04:22:15.780 回答
4

改进 Lutz 发布的内容:

def isinstance_namedtuple(x):                                                               
  return (isinstance(x, tuple) and                                                  
          isinstance(getattr(x, '__dict__', None), collections.Mapping) and         
          getattr(x, '_fields', None) is not None)                                  
于 2018-03-16T16:54:06.040 回答
1

我用

isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)

在我看来,这似乎最能反映命名元组性质的字典方面。对于一些可以想象的未来变化,它似乎也很健壮,并且如果碰巧存在这样的事情,它也可能适用于许多第三方命名元组类。

于 2014-06-20T16:05:52.173 回答
0

IMO 这可能是Python 3.6及更高版本的最佳解决方案。

您可以__module__在实例化您的命名元组时设置自定义,并稍后检查它

from collections import namedtuple

# module parameter added in python 3.6
namespace = namedtuple("namespace", "foo bar", module=__name__ + ".namespace")

然后检查__module__

if getattr(x, "__module__", None) == "xxxx.namespace":

于 2020-07-08T09:12:27.827 回答