Wie um zu überprüfen, ob ein Objekt eine Instanz einer namedtuple?
Wie kann ich überprüfen, ob ein Objekt eine Instanz einer Benannte Tupel?
- Sie müssen wissen, absolut, oder eine heuristische okay? Falls letzteres, können Sie prüfen, z.B. obj._asdict.__doc__ == 'Return eine neue OrderedDict die Karten Feldnamen, um Ihre Werte" (möglicherweise auch die anderen Faktoren).
- Absolut, natürlich. Aber da wäre ich mit dieser "check" in eine
assert
- Anweisung nur (ich Schreibe eine Erweiterung zu namedtuples .. das mixin behauptet, dass es verwendet wird, mit namedtuple, wie seine Geschwister-Basis-Klasse), heuristische überprüfung kann auch in Ordnung sein. Ich denke, es lohnt sich hinzufügen Ihre__doc__
überprüfen zu Alex ' s code. - FWIW, dies ist eingereicht als einen "Fehler" (nicht sicher, ich Stimme mit): bugs.python.org/issue7796
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufruf der Funktion
collections.namedtuple
gibt Ihnen eine neue Art, die eine Unterklasse vontuple
(und keine anderen Klassen) mit einem Mitglied namens_fields
ist ein Tupel, dessen Elemente alle Zeichenketten. So könnte man prüfen, für jede und jeden, der diese Dinge:es IST möglich, eine false-positive aus, aber nur, wenn jemand geht aus dem Weg zu machen, ein Typ, der sieht ein viel wie ein benannter Tupel aber nicht;-).
NamedTuple
deren definition wäre einfachclass NamedTuple(tuple): pass
.. nur um es einfach für uns, um zu überprüfen, ob ein Objekt ein namedtuple oder nicht.x
undy
Felder und eins mitcost
,price
, undquantity
Felder sind nicht austauschbar. Die einzige Ebene, auf der Sie austauschbar sind, ist, dass Sie beide Tupel. Auch bei der Verwendung bei der Arbeit mit den Klassen erzeugt, die von der namedtuple Fabrik, Sie sind nur normale Klassen mit gutem Grund und kann genauso verwendet werden wie auch eine ähnliche hand-made-Klasse.assert
s sind nicht garantiert ausgeführt werden, sind Sie nicht das richtige Werkzeug für die Suche nach etwas, das Sie brauchen, um zu überprüfen.)namedtuple
ist, wenn Sie wollen, um serialisieren/Marschall eine Instanz. Marshalling einnamedtuple
würde gemacht viel anders als ein generisches Tupel, da Sie wollen, um zu bewahren die Namen irgendwie.json.dumps
. Oder jede andere Gelegenheit, wo Sie wollen, um einige zu Betrieb unterschiedlich.Ich weiß, das ist alt, aber ich fand dies nützlich:
Wenn Sie brauchen, um zu überprüfen, bevor Sie namedtuple bestimmte Funktionen, dann nennen Sie einfach und fangen Sie die Ausnahme statt. Das ist der bevorzugte Weg, es zu tun in python.
Verbesserung auf, was Lutz gepostet:
Benutze ich
denen mir scheint am besten entsprechen, das Wörterbuch Aspekt der Natur der benannten Tupel.
Es scheint robust gegen einige denkbare zukünftige Veränderungen zu und kann auch mit vielen Drittanbieter-namedtuple-ish-Klassen, wenn solche Dinge passieren, zu existieren.
x = (1,2,3)