¿Cómo verificar si un objeto es una instancia de un duplicado?

¿Cómo verifico si un objeto es una instancia de una tupla nombrada ?

Llamar a la función collections.namedtuple le da un nuevo tipo que es una subclase de tuple (y ninguna otra clase) con un miembro llamado _fields que es una tupla cuyos elementos son todas cadenas. Para que puedas revisar todas y cada una de estas cosas:

 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) 

Es posible obtener un falso positivo de esto, pero solo si alguien está haciendo un esfuerzo para crear un tipo que se parece mucho a una tupla con nombre pero no es uno ;-).

Me doy cuenta de que esto es viejo, pero me pareció útil:

 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 

Si necesita verificar antes de llamar a funciones de doble nombradas en él, simplemente llámelos y detecte la excepción. Esa es la forma preferida de hacerlo en python.

Mejorando en lo que Lutz publicó:

 def isinstance_namedtuple(x): return (isinstance(x, tuple) and isinstance(getattr(x, '__dict__', None), collections.Mapping) and getattr(x, '_fields', None) is not None) 

yo suelo

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

lo que para mí parece reflejar mejor el aspecto del diccionario de la naturaleza de las tuplas nombradas. Parece robusto contra algunos cambios futuros concebibles también y también podría funcionar con muchas clases de terceros con nombre, si es que tales cosas existen.