Destructuring-binden Wörterbuch-Inhalt
Ich versuche zu 'destructure' ein Wörterbuch und ordnen Sie die Werte mit Variablen Namen nach seinem Schlüssel. So etwas wie
params = {'a':1,'b':2}
a,b = params.values()
Aber da dictionaries nicht sortiert, es gibt keine Garantie, dass params.values()
zurück Werte werden in der Reihenfolge der (a, b)
. Ist es ein schöner Weg, dies zu tun?
- Faul? Vielleicht... aber natürlich habe ich gezeigt habe, der einfachste Fall für die illustration. Im Idealfall wollte ich zu tun haben, wie für x in params.Artikel: eval('%s = %f' % x), aber ich denke eval() erlaubt keine Zuweisungen.
- Ich bin mir ziemlich sicher, dass die meisten Nutzer von ES6 (JavaScript) mag das neue Objekt destructuring syntax:
let {a, b} = params
. Es erhöht die Lesbarkeit und ist vollständig inline mit dem, was Zen Sie reden wollen. - Ich Liebe Objekt destructuring in JS. Was für eine saubere, einfache und lesbare Weise zu extrahieren einige Schlüssel von einem dict. Ich kam hierher mit der Hoffnung, etwas ähnliches in Python.
- sicherlich beats-Python-Tupel destructuring, wo man Sie leicht erreichen kann die Reihenfolge falsch!
- Ich Liebe auch ES6 Objekt destructuring, aber ich fürchte, es kann nicht funktionieren in Python aus dem gleichen Grund ES6 ' s Map-Objekt nicht unterstützt destructuring. Keys sind nicht nur strings in ES6 Karte und Python dict. Auch, obwohl ich Liebe das "zupfen" Stil-Objekt destructuring in ES6, die Zuordnung der Art ist nicht einfach. Was ist denn hier Los?
let {a: waffles} = params
. Es dauert ein paar Sekunden, um es herauszufinden, auch wenn du es gewöhnt bist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du Angst hast, die Probleme, die bei der Nutzung der einheimischen Wörterbuch und Sie es vorziehen zu Folgen, Ihre ursprüngliche Strategie, Bestellt Wörterbücher von python 2.7 und 3.1 Sammlungen.OrderedDicts ermöglicht es Ihnen, wiederherstellen Sie dictionary-Objekte in der Reihenfolge, in der Sie erstmals eingesetzt
Einen Weg, dies zu tun mit weniger Wiederholungen als Jochen ' s Vorschlag ist mit einer helper-Funktion. Dies gibt die Flexibilität, um Ihre Variablen-Namen in beliebiger Reihenfolge und nur destructure eine Teilmenge dessen, was im dict:
Auch anstelle von joaquin OrderedDict so Sortieren Sie die Tasten und Holen Sie sich die Werte. Den nur Fänge sind, müssen Sie Ihre Variablen-Namen in alphabetischer Reihenfolge und destructure alles im dict:
lambda
einer Variablen, Sie könnte genauso gut verwenden Sie die normale Funktion syntax mitdef
.Statt aufwändiger lambda-Funktionen oder Wörterbuch Verständnis, können auch mit einer eingebauten Bibliothek.
Python ist nur in der Lage, "destructure" - Sequenzen, keine Wörterbücher. So, zu schreiben, was Sie wollen, müssen Sie die Zuordnung der Einträge zu einem richtigen Reihenfolge. Als an mich selbst, den nächsten match, den ich finden konnte ist die (nicht sehr sexy):
Dieser arbeitet mit Generatoren zu:
Hier ist ein vollständiges Beispiel:
Vielleicht wollen Sie wirklich so etwas tun?
Hier ist ein weiterer Weg, es zu tun, ähnlich wie einen destructuring assignment funktioniert in JS:
Was wir getan haben, war das entpacken der params-dictionary in die wichtigsten Werte (mit **) (wie in Jochen ' s Antwort), dann haben wir diese Werte in den lambda signature und belegt Sie nach dem Schlüssel - Namen-und hier ist ein bonus - wir bekommen auch ein Wörterbuch, was auch immer ist nicht in der lambda-Signatur, also, wenn Sie hatte:
Nach der lambda-Ausdruck angewendet wurde, der rest variable enthält nun:
{'c': 3}
Nützlich für das weglassen nicht benötigter Schlüssel aus einem Wörterbuch.
Hoffe, das hilft.
versuchen, diese
Ergebnis:
Gut, wenn Sie wollen diese in einer Klasse können Sie dies jederzeit tun:
Ich weiß nicht, ob es guter Stil, aber
locals().update(params)
wird den trick tun. Sie haben dann
a
,b
und was war Ihreparams
dict zur Verfügung als die entsprechenden lokalen Variablen.