2010-01-30 100 views
16

如何检查对象是否为Named tuple的实例?Python:如何检查一个对象是否是namedtuple的一个实例?

+0

你需要绝对知道,或者是一种启发式好吗?如果是后者,你可以检查例如obj._asdict .__ doc__ =='返回一个新的OrderedDict,它将字段名称映射到它们的值(可能还有其他因素)。当然, – 2010-01-30 04:18:04

+0

绝对如此。但是因为我只是在'assert'语句中使用这个“检查”(我正在向namedtuples写一个扩展......这个mixin声明它与namedtuple一起用作它的兄弟基类),启发式检查也可能是精细。我认为值得将'__doc__'检查添加到Alex的代码中。 – 2010-01-30 04:26:31

+4

FWIW,这是提交作为一个“错误”(不知道我同意):http://bugs.python.org/issue7796 – bernie 2010-01-30 04:32:49

回答

19

调用功能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) 

有可能从该得到假阳性,但只有当有人在走出去的方式,使一个类型,看起来很多像一个命名的元组,但不是一个;-)。

+0

正确。我还想知道为什么生成的类型不是从标记类'NamedTuple'派生的,它的定义只是'class NamedTuple(tuple):pass' ..只是为了方便我们检查一个对象是否是一个namedtuple或者不。 – 2010-01-30 04:25:05

+2

为什么namedtuple的设计师会让它变得可怕,Sridhar?在Python中通常要避免使用类型检查,在这种情况下,不会告诉你任何有用的东西 - 具有'x'和'y'字段的名称集合以及具有'cost','price'和'quantity'字段的名称aren aren将不可互换。它们可以互换的唯一级别是它们都是元组。 即使在使用由namedtuple工厂生成的类的使用情况下,它们也只是普通类,具有很好的理由,并且可以像使用类似的手工类一样使用。 – 2010-01-30 21:20:27

+0

@Mike:我写了一个名为元组的扩展..其中mixin声明它与指定元组一起用作其兄弟基类。所以我只需要它来声明mixin不会被其他类型滥用。 – 2010-01-30 21:32:15

3

如果您在调用namedtuple特定函数之前需要检查,那么只需调用它们并捕获异常。这是使用python的首选方式。

+0

我对上面马修的回复解释了我使用这张支票的地方。 – 2010-01-30 04:31:02

0

我用

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

这对我来说似乎是最能体现一个名为元组的性质的字典方面。 它似乎对一些可以想象的将来的变化也很有效,如果这种情况发生,也可能与许多第三方命名的三类类一起工作。

+1

这将导致错误,当'x =(1,2,3)' – kolypto 2014-09-02 10:31:43

3

我意识到这是旧的,但我发现这个有用:

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 
+0

除非我失去了一些东西,这似乎是最好和最简洁的答案。 namedtuple创建一个新类型,isinstance将检查是否有某种类型。 – 2018-02-20 17:08:26

相关问题