Wie kann man überprüfen, ob ein Objekt eine Instanz einer namedtuple ist?
-
24-09-2019 - |
Frage
Wie kann ich überprüfen, ob ein Objekt eine Instanz eines Named Tupel ?
Lösung
Der Aufruf der Funktion collections.namedtuple
gibt Ihnen eine neue Art, die eine Unterklasse von tuple
ist (und keine anderen Klassen) mit einem Mitglied namens _fields
, die ein Tupel, deren Elemente ist sind alle Saiten. So können Sie für jede und jeder dieser Dinge überprüfen können:
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)
ist es möglich, ein falsch positiven daraus zu bekommen, aber nur dann, wenn jemand aus dem Weg gehen, um eine Art zu machen, die ein Los aussieht wie ein benanntes Tupel ist aber nicht ein ;-) .
Andere Tipps
Ich weiß, das ist alt, aber ich fand dies nützlich:
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
Wenn Sie vor dem Aufruf namedtuple bestimmte Funktionen auf sie überprüfen müssen, dann sie einfach anrufen und die Ausnahme statt fangen. Das ist der bevorzugte Weg, um es in Python zu tun.
Die Verbesserung auf, was Lutz geschrieben:
def isinstance_namedtuple(x):
return (isinstance(x, tuple) and
isinstance(getattr(x, '__dict__', None), collections.Mapping) and
getattr(x, '_fields', None) is not None)
ich
isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)
die mir scheint am besten, das Wörterbuch Aspekt der Natur benannter Tupel reflektieren. Es scheint robust gegen einige denkbare zukünftige Änderungen zu und könnte auch die Arbeit mit vielen Drittanbietern namedtuple-ish Klassen, wenn solche Dinge passieren existieren.