Ale*_*lli 39

调用该函数 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)
Run Code Online (Sandbox Code Playgroud)

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

  • @MikeGraham古老的帖子,但是......如果你想要序列化/编组它的一个实例,那么攻击一个`namedtuple`的一个原因就是.编组一个`namedtuple`将与通用元组完全不同,因为你想以某种方式保留名称. (4认同)
  • @MikeGraham对于`json.dumps`.或者您想要以不同方式进行某些操作的任何其他场合. (3认同)
  • 为什么namedtuple的设计师会让它成为可以检测的,Sridhar?在Python中通常要避免使用Typechecking,在这种情况下并不会告诉你任何有用的东西 - 一个带有`x`和`y`字段的namedtuple和一个带有`cost`,`price`和`quantity`字段的字段不可互换.它们可以互换的唯一级别是它们都是元组.即使在使用由namedtuple工厂生成的类的用例中,它们也只是正常的类,并且可以像类似的手工类一样使用. (2认同)
  • @Srindhar:你真的不需要检查这是一个由 namedtuple 生成的类的实例,你只需要它与你的 mixin 一起工作。编写损坏代码的愚蠢用户无法通过检查来修复,而使用您的代码的聪明用户只会受到检查的潜在阻碍。(此外,由于不能保证 `assert`s 运行,它们不是检查需要检查的东西的正确工具。) (2认同)

Mat*_*ice 20

我意识到这是旧的,但我觉得这很有用:

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
Run Code Online (Sandbox Code Playgroud)

  • 这与接受的答案不同 - 这个答案检查*特定*namedtuple的实例,而接受的答案检查*any*namedtuple的实例. (5认同)

tec*_*kuz 10

3.7+

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

Run Code Online (Sandbox Code Playgroud)