Ich habe eine benannte Tupelklasse in Python
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Ich möchte Town-Instanzen in Wörterbücher konvertieren. Ich möchte nicht, dass es fest mit den Namen oder der Nummer der Felder in einer Stadt verbunden ist.
Gibt es eine Möglichkeit, es so zu schreiben, dass ich weitere Felder hinzufügen oder ein ganz anderes benanntes Tupel übergeben und ein Wörterbuch erhalten kann?
Ich kann die ursprüngliche Klassendefinition nicht wie im Code eines anderen ändern. Also muss ich eine Instanz einer Stadt nehmen und sie in ein Wörterbuch konvertieren.
python
dictionary
tuples
namedtuple
Ohne mich ist es einfach Aweso
quelle
quelle
dir
Befehl an, der Ihnen die Felder für jedes Objekt anzeigt ... das die_asdict
Funktion direkt angezeigt hätte .dict
anstelle von 'namedtuple' verwenden und das namedtuple an den Initialisierer übergeben möchten. Denken Sie daran, dass, wenn Sie an Cxx gewöhnt sind,class Town(x)
nicht der Konstruktordef __init__(self, *args, **kwargs)
darin ist.dir
ist nur ein integrierter Python ... Sie können es auf jedem Python-Objekt, in einer Konsole oder in einem Skript ausführen (wo es eine Liste zurückgibt, die Sie drucken oder mit was auch immer tun können), und es wird eine Liste von (fast) zurückgeben ) alle Attribute des Objekts. hilfreich, wenn Sie herausfinden möchten, wie ein unbekanntes Objekt funktioniert.Antworten:
TL; DR: Hierfür wird eine Methode
_asdict
bereitgestellt.Hier ist eine Demonstration der Verwendung:
Dies ist eine dokumentierte Methode für benannte Tupel, dh im Gegensatz zu der in Python üblichen Konvention ist der führende Unterstrich des Methodennamens nicht dazu da, die Verwendung zu verhindern . Zusammen mit den anderen Methoden zu namedtuples hinzugefügt
_make
,_replace
,_source
,_fields
, hat es den Unterstrich nur zu versuchen und zu verhindern , dass Konflikte mit möglichen Feldnamen.Hinweis: Für einige 2.7.5 <Python-Version <3.5.0-Code in freier Wildbahn wird möglicherweise folgende Version angezeigt:
Für eine Weile hatte die Dokumentation erwähnt, dass dies
_asdict
veraltet war (siehe hier ), und vorgeschlagen, die eingebaute Methode vars zu verwenden . Dieser Rat ist jetzt veraltet; Um einen Fehler im Zusammenhang mit Unterklassen zu beheben , wurde die__dict__
Eigenschaft, die in namedtuples vorhanden war, durch dieses Commit erneut entfernt .quelle
_asdict
nicht in der Standardbibliothek zu aliasenasdict
?"asdict"
einer der Tupelnamen sein .Es gibt eine eingebaute Methode für
namedtuple
Instanzen dafür_asdict
.Wie in den Kommentaren besprochen, wird dies bei einigen Versionen
vars()
ebenfalls der_asdict
Fall sein , aber es hängt anscheinend stark von den Build-Details ab, sollte jedoch zuverlässig sein. In einigen Versionen_asdict
wurde dies als veraltet markiert, aber Kommentare weisen darauf hin, dass dies ab 3.4 nicht mehr der Fall ist.quelle
_asdict
Methode in Python3 (zugunsten von Vars) veraltet istvars
würde es bei einigen älteren Versionen nicht funktionieren - bei 2.7 wird ein a ausgelöstTypeError
, da dienamedtuple
Klasse dieser Version kein__dict__
Attribut hat.Unter Ubuntu 14.04 LTS-Versionen von python2.7 und python3.4 funktionierte die
__dict__
Eigenschaft wie erwartet. Die_asdict
Methode hat auch funktioniert, aber ich bin geneigt, die durch Standards definierte, einheitliche Eigenschafts-API anstelle der lokalisierten, nicht einheitlichen API zu verwenden.$ python2.7
Sehen als dict ist die semantische Art und Weise ein Wörterbuch darstellt soemthing zu bekommen, (zumindest auf meinem besten Wissen).
Es wäre schön, eine Tabelle der wichtigsten Python-Versionen und -Plattformen und deren Unterstützung für zu sammeln.
__dict__
Derzeit habe ich nur eine Plattformversion und zwei Python-Versionen, wie oben angegeben.quelle
__dict__
funktioniert nicht.Fall 1: eindimensionales Tupel
Fall 2: Zweidimensionales Tupel
Beispiel: DICT_ROLES [961] # zeigt 'Back-End-Programmierer' an.
quelle
Wenn kein _asdict () vorhanden ist, können Sie Folgendes verwenden:
quelle
Python 3. Ordnen Sie dem Wörterbuch ein beliebiges Feld als erforderlichen Index für das Wörterbuch zu. Ich habe 'name' verwendet.
quelle