Überschreibe die {...} -Notation, damit ich ein OrderedDict () anstelle eines dict () bekomme?
Ich verwenden möchte .py Datei wie eine config-Datei.
Also mit der {...}
notation ich kann ein Wörterbuch verwenden strings als Schlüssel, aber die definition, Ordnung verloren in einem standard-python-dictionary.
Meine Frage: ist es möglich, das überschreiben der {...}
notation, so dass ich eine OrderedDict()
statt einer dict()
?
Ich hatte gehofft, dass einfach überschreiben dict-Konstruktor mit OrderedDict (dict = OrderedDict
) funktionieren würde, aber es funktioniert nicht.
ZB:
dict = OrderedDict
dictname = {
'B key': 'value1',
'A key': 'value2',
'C key': 'value3'
}
print dictname.items()
Ausgabe:
[('B key', 'value1'), ('A key', 'value2'), ('C key', 'value3')]
Kommentar zu dem Problem
Ich gehe davon aus, dass die Ausgabe bereits erwähnt, hier ist, was Sie möchte - nicht, was passiert ?
FYI Menschen stolpern auf diese 5 Jahre alte Frage im Jahr 2016: ab python 3.6 alle
dict
s behalten einlegen, um so vorwärts geht keiner dieser hacks benötigt werden. @NickSweeting docs.python.org/3/whatsnew/3.6.html#new-dict-implementation sagt, "Der Auftrag-die Erhaltung Aspekt der neuen Implementierung ist als ein Implementierungsdetail und sollte nicht als verlässlich angesehen werden".
@Samuel Santana die Art, wie ich Lesen Sie den rest des Satzes, den du zitiert hast der Anfang lässt vermuten, dass das neue Bestell-Erhaltung ist die langfristige gewünschte Semantik für die Sprache, ohne sich auf es mit der rechten jetzt.
InformationsquelleAutor der Frage fdb | 2011-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein hack, der fast gibt Ihnen die syntax, die Sie wollen:
Edit: Jemand anderes entdeckt, und das unabhängig, und veröffentlichte die
odictliteral
Paket auf PyPI, bietet eine etwas gründlichere Umsetzung - diese stattdessen zu verwendenInformationsquelleAutor der Antwort Eric
Wortwörtlich das bekommen, was Sie fordern, Sie haben zu hantieren, mit der syntax-Baum deiner Datei. Ich glaube nicht, dass es ist ratsam, dies zu tun, aber ich konnte der Versuchung nicht widerstehen, es zu versuchen. So hier gehen wir.
Erstes erstellen wir ein Modul mit einer Funktion
my_execfile()
das funktioniert wie die eingebautenexecfile()
, außer, dass Sie alle vorkommen des Wörterbuch-displays, z.B.{3: 4, "a": 2}
ersetzt werden durch explizite Aufrufe an diedict()
Konstruktor, z.B.dict([(3, 4), ('a', 2)])
. (Natürlich könnten wir direkt ersetzen Sie Sie durch Aufrufecollections.OrderedDict()
, aber wir wollen nicht zu aufdringlich.) Hier ist der code:Mit dieser änderung in Ort, wir kann ändern das Verhalten des Wörterbuch-displays durch überschreiben
dict
. Hier ist ein Beispiel:Nun können wir diese Datei mit
my_execfile("test.py")
, woraus sich die AusgabeBeachten Sie, dass für die Einfachheit der obige code nicht berühren Wörterbuch Verstehens, die umgewandelt werden soll, generator-Ausdrücke übergeben
dict()
Konstruktor. Sie müssten hinzufügenvisit_DictComp()
Methode, um dieDictDisplayTransformer
Klasse. Angesichts der oben genannten Beispiel-code, das sollte straight-forward.Wieder, ich weiß nicht empfehlen diese Art Herumspielen mit der Sprache-Semantik. Hast du einen Blick in die
ConfigParser
Modul?InformationsquelleAutor der Antwort Sven Marnach
OrderedDict
ist nicht "standard-python-syntax", jedoch eine geordnete Menge von Schlüssel-Wert-Paare (in der standard-python-syntax) ist einfach:Explizit erhalten eine
OrderedDict
:Andere alternative, ist die Art
dictname.items()
, wenn das ist alles, was Sie brauchen:InformationsquelleAutor der Antwort Austin Marshall
Was Sie verlangen ist unmöglich, aber wenn Sie eine config-Datei in JSON syntax ist ausreichend, Sie können tun, etwas ähnliches mit dem
json
- Modul:InformationsquelleAutor der Antwort Magnus Hoff
Die eine Lösung, die ich gefunden ist, um patch-python selbst, wodurch die
dict
Objekt erinnere mich an die Reihenfolge der Einfügemarke.Dies funktioniert für alle Art von Syntax:
etc.
Habe die
ordereddict
C Umsetzung von https://pypi.python.org/pypi/ruamel.ordereddict/ und zusammengelegt zurück in die Haupt-python-code.Wenn es Sie nicht stört, re-Gebäude der python-interpreter, hier ist ein patch für Python 2.7.8:
https://github.com/fwyzard/cpython/compare/2.7.8...ordereddict-2.7.8.diff
.Ein
InformationsquelleAutor der Antwort fwyzard
Wenn das, was Sie suchen, ist ein Weg, um easy-to-use-Initialisierungs-syntax - erstellen Sie eine Unterklasse von OrderedDict und Operatoren hinzufügen, um es, die update-dict, zum Beispiel:
d - OrderedMap([(1, 2), (4, 3), ('key','value')])
Weiteres möglich syntactic-sugar Beispiel mit dem slicing-syntax:
InformationsquelleAutor der Antwort Or Weis
Als python-3.6, alle Wörterbücher werden bestellt standardmäßig. Für jetzt, dies ist eine Implementierung detail
dict
und sollten nicht verlassen werden, aber es wird wahrscheinlich zum standard werden nach v3.6.Insertion order immer beibehalten in den neuen
dict
Umsetzung:Als python 3.6
**kwargs
um [PEP468] und class-Attribut, um [PEP520] werden beibehalten. Die neue kompakte, geordnete Wörterbuch Umsetzung umgesetzt, die Bestellung für Sie beide.InformationsquelleAutor der Antwort Nick Sweeting