Вызов функции 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)
Возможно получить ложный положительный результат от этого, но только если кто-то изо всех сил пытается сделать тип, который выглядит как lot как именованный кортеж, но не один ;-).