wie kann ich Felder hinzufügen, um eine namedtuple?
Ich arbeite mit einer Liste von namedtuples. Ich möchte ein Feld hinzufügen, jede benannte Tupel, nachdem es bereits erstellt worden. Es scheint, ich kann dies tun, indem Sie einfach auf Sie verweisen als Attribut (wie in namedtuple.attribute = 'foo'
), aber dann ist es nicht Hinzugefügt, um die Liste der Felder. Gibt es einen Grund, warum sollte ich das nicht tun es auf diese Weise, wenn ich nichts mit der Liste Felder? Gibt es einen besseren Weg, um ein Feld hinzuzufügen?
>>> from collections import namedtuple
>>> result = namedtuple('Result',['x','y'])
>>> result.x = 5
>>> result.y = 6
>>> (result.x, result.y)
(5, 6)
>>> result.description = 'point'
>>> (result.x, result.y, result.description)
(5, 6, 'point')
>>> result._fields
('x', 'y')
Und warum verwenden Sie nicht nur dict? dict.Schlüssel sicher hinterlegt haben, 'Felder'.
InformationsquelleAutor rudivonstaden | 2013-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie tun, funktioniert, weil
namedtuple(...)
gibt eine neue Klasse. Bekommt man eigentlich ein Ergebnis-Objekt, das Sie instanziieren die Klasse. Also der korrekte Weg ist:Und Sie werden feststellen, dass das hinzufügen von Attributen zu diesen Objekten hat nicht Arbeit. So der Grund, warum sollten Sie es nicht tun, weil es nicht funktioniert. Nur missbrauchen Objekte der Klasse arbeiten, und ich hoffe, ich brauche nicht ins detail zu gehen, warum dies ist eine schreckliche, schreckliche Idee.
Beachten Sie, dass unabhängig davon, ob Sie Attribute hinzufügen, um namedtuples oder nicht (und selbst wenn Sie eine Liste aller Attribute, die Sie brauchen vorher), Sie können nicht ändern, eine namedtuple Objekt, nachdem es erstellt wurde. Tupel sind unveränderlich. Also, wenn Sie Sie brauchen, um Objekte nach der Erstellung aus irgendeinem Grund, in keiner Weise oder Form, Sie können nicht
namedtuple
. Du bist besser dran, die Definition einer benutzerdefinierten Klasse (einige der Dinge, dienamedtuple
fügt für Sie nicht auch sinnvoll für veränderliche Objekte).InformationsquelleAutor
Beachten Sie, dass hier, das Sie gerade Bearbeiten
type
von der benannten Tupel, die nicht Instanzen von diesem Typ. In diesem Fall würden Sie wahrscheinlich wollen, um eine neue Art mit einem zusätzlichen Feld von der alte:z.B.:
InformationsquelleAutor mgilson
Können Sie ein neues Feld hinzufügen, um eine
namedtuple
nach, es zu definieren. Einzige Weg ist, um eine neue Vorlage zu erstellen und die Schaffung neuernamedtuple
Instanzen.Analyse
result
ist kein Tupel, sondern die Klasse, die erstellt Tupel.Erstellen Sie ein neues Tupel so:
Druckt den Wert
x
imp
.Dies wirft Fehler, weil Tupel unveränderlich ist.
Dadurch ändert sich nichts.
Dadurch ändert sich nichts.
Lösung
InformationsquelleAutor ATOzTOA
Können Sie ganz einfach verketten namedtuples, wenn man bedenkt, dass Sie unveränderlich sind
InformationsquelleAutor Anton Ovsyannikov