Frage

Wie kann ich überprüfen, ob ein Objekt eine Instanz eines Named Tupel ?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top