How to check if an object is an instance of a namedtuple?

后端 未结 7 1518
轮回少年
轮回少年 2020-12-08 18:39

How do I check if an object is an instance of a Named tuple?

相关标签:
7条回答
  • 2020-12-08 19:04

    If you need to check before calling namedtuple specific functions on it, then just call them and catch the exception instead. That's the preferred way to do it in python.

    0 讨论(0)
  • 2020-12-08 19:05

    IMO this might be the best solution for Python 3.6 and later.

    You can set a custom __module__ when you instantiate your namedtuple, and check for it later

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

    then check for __module__

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

    0 讨论(0)
  • 2020-12-08 19:08

    I use

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

    which to me appears to best reflect the dictionary aspect of the nature of named tuples. It appears robust against some conceivable future changes too and might also work with many third-party namedtuple-ish classes, if such things happen to exist.

    0 讨论(0)
  • 2020-12-08 19:10

    Calling the function collections.namedtuple gives you a new type that's a subclass of tuple (and no other classes) with a member named _fields that's a tuple whose items are all strings. So you could check for each and every one of these things:

    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)
    

    it IS possible to get a false positive from this, but only if somebody's going out of their way to make a type that looks a lot like a named tuple but isn't one;-).

    0 讨论(0)
  • 2020-12-08 19:14

    3.7+

    def isinstance_namedtuple(obj) -> bool:
        return (
                isinstance(obj, tuple) and
                hasattr(obj, '_asdict') and
                hasattr(obj, '_fields')
        )
    
    
    0 讨论(0)
  • 2020-12-08 19:15

    Improving on what Lutz posted:

    def isinstance_namedtuple(x):                                                               
      return (isinstance(x, tuple) and                                                  
              isinstance(getattr(x, '__dict__', None), collections.Mapping) and         
              getattr(x, '_fields', None) is not None)                                  
    
    0 讨论(0)
提交回复
热议问题