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

时间:2010-01-30 04:12:44

标签: python introspection namedtuple isinstance

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

7 个答案:

答案 0 :(得分:36)

调用函数 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)

有可能从中获得误报,但前提是有人不顾一切地制作一个看起来像很多的类型,而不是一个名字元组;但是不是一个;-)

答案 1 :(得分:15)

我意识到这已经过时了,但我觉得这很有用:

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

改善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)                                  

答案 4 :(得分:2)

3.7 +

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

答案 5 :(得分:0)

我用

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

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

答案 6 :(得分: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":