How to check if an object is an instance of a namedtuple?
Solution 1
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;-).
Solution 2
If you want to determine whether an object is an instance of a specific namedtuple, you can do this:
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
Solution 3
3.7+
def isinstance_namedtuple(obj) -> bool:
return (
isinstance(obj, tuple) and
hasattr(obj, '_asdict') and
hasattr(obj, '_fields')
)
Solution 4
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.
Solution 5
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)
![Sridhar Ratnakumar](https://i.stack.imgur.com/gVHrv.jpg?s=256&g=1)
Sridhar Ratnakumar
Updated on July 09, 2022Comments
-
Sridhar Ratnakumar almost 2 years
How do I check if an object is an instance of a Named tuple?