Das konkrete Beispiel ist eine Liste der Dateinamen und ihrer Größen. Ich kann mich nicht entscheiden, ob jedes Element in der Liste die Form haben {"filename": "blabla", "size": 123}
soll oder nur ("blabla", 123)
. Ein Wörterbuch erscheint mir logischer, weil der Zugriff auf die Größe zum Beispiel file["size"]
erklärender ist als file[1]
... aber ich weiß es nicht genau. Gedanken?
python
dictionary
clb
quelle
quelle
fname, file_size = file
wenn Daten das oben genannte Tupel sind, sollten Sie sie beseitigenfile[1]
und durch ersetzenfile_size
. Dies setzt natürlich eine gute Dokumentation voraus.Antworten:
Ich würde ein verwenden
namedtuple
:Jetzt können Sie
file.size
undfile.filename
in Ihrem Programm verwenden, was meiner Meinung nach die am besten lesbare Form ist. Notenamedtuple
erstellt unveränderliche Objekte wie Tupel und diese sind leichter als Wörterbücher, wie hier beschrieben .quelle
Filesize = namedtuple('Filesize', 'filepath kilobytes')
attrs
Modul verwenden (können es findenpip
oder nur danach suchen), mit dem Sie dem genannten Tupel sehr ähnliche syntaktische Bequemlichkeiten bieten können, aber Sie können die Veränderbarkeit angeben (können aber auch unveränderlich gemacht werden). Der wesentliche funktionale Unterschied besteht darin, dass selbstattrs
erstellte Klassen nicht mit einfachen Tupeln verglichen werden können, wie es beinamedtuple
s der Fall ist .class
,def
Und=
alle überschreiben nur alle früheren Verwendungen. repl.itnamedtuple
im Wesentlichen eine Kurzdeklaration für einen neuen Typ mit unveränderlichen Attributen ist. Das heißt, die Antwort lautet effektiv "Weder eintuple
noch eindict
, sondern einobject
." +1Dies ist die uralte Frage, ob Sie Ihr Format / Schema bandintern oder bandextern codieren möchten.
Sie tauschen etwas Speicher aus, um die Lesbarkeit und Portabilität zu erhalten, die sich aus dem Ausdruck des Formats der Daten direkt in den Daten ergibt. Wenn Sie dies nicht tun, müssen Sie wissen, dass das erste Feld der Dateiname und das zweite die Größe ist. Das spart Speicherplatz, kostet aber Lesbarkeit und Portabilität. Was kostet Ihr Unternehmen mehr Geld?
Denken Sie daran, dass unveränderliche Inhalte angesichts von Veränderungen nicht nutzlos sind. Dies bedeutet, dass wir mehr Speicherplatz benötigen, die Änderungen in einer Kopie vornehmen und die neue Kopie verwenden müssen. Das ist nicht kostenlos, aber es ist oft kein Deal Breaker. Wir verwenden unveränderliche Zeichenfolgen, um die Dinge ständig zu ändern.
Eine weitere Überlegung ist die Erweiterbarkeit. Wenn Sie Daten nur in Position speichern, ohne Formatinformationen zu verschlüsseln, sind Sie nur zur einmaligen Vererbung verurteilt. Dies ist in Wirklichkeit nichts anderes als die Praxis, zusätzliche Felder nach den festgelegten Feldern zu verketten. Ich kann ein drittes Feld als Erstellungsdatum definieren und trotzdem mit Ihrem Format kompatibel sein, da ich das erste und das zweite Feld auf die gleiche Weise definiere.
Was ich jedoch nicht tun kann, ist, zwei unabhängig definierte Formate zusammenzuführen, die einige überlappende Felder haben, andere nicht, sie in einem Format zu speichern und für Dinge nützlich zu sein, die nur das eine oder andere Format kennen.
Dazu muss ich die Formatinformationen von Anfang an codieren. Ich muss sagen "Dieses Feld ist der Dateiname". Dies ermöglicht eine mehrfache Vererbung.
Vermutlich sind Sie daran gewöhnt, dass Vererbung nur im Kontext von Objekten ausgedrückt wird, aber für Datenformate funktionieren dieselben Ideen, da Objekte in Datenformaten gespeichert werden. Es ist genau das gleiche Problem.
Verwenden Sie also, was Sie am ehesten benötigen. Ich greife nach Flexibilität, es sei denn, ich kann auf einen guten Grund hinweisen, dies nicht zu tun.
quelle
Ich würde eine Klasse mit zwei Eigenschaften verwenden.
file.size
ist schöner als entwederfile[1]
oderfile["size"]
.Einfach ist besser als komplex.
quelle
file = Filesize(filename='stuff.txt', size=222)
undfiletup = ("stuff.txt", 222)
beide generieren denselben JSON:json.dumps(file)
undjson.dumps(filetup)
führen zu:'["stuff.txt", 222]'
Sind die Dateinamen eindeutig? In diesem Fall könnten Sie die Liste komplett löschen und einfach ein reines Wörterbuch für alle Dateien verwenden. zB (eine hypothetische Website)
etc...
Jetzt erhalten Sie nicht "Name" und "Größe", Sie verwenden nur Schlüssel und Wert, aber oft ist dies natürlicher. YMMV.
Wenn Sie aus Gründen der Übersichtlichkeit wirklich eine "Größe" wünschen oder mehr als einen Wert für die Datei benötigen, gehen Sie wie folgt vor:
quelle
In Python ist das Wörterbuch ein veränderbares Objekt. Auf der anderen Seite ist Tupel ein unveränderliches Objekt.
Wenn Sie den Wörterbuchschlüssel ändern müssen, müssen Sie das Wertepaar häufig oder jedes Mal ändern. Ich schlage vor, Wörterbuch zu verwenden.
Wenn Sie feste / statische Daten haben, empfehle ich Tupel zu verwenden.
Tupeldaten können jedoch nicht mit dem Zuweisungsoperator geändert werden.
quelle