Python sichere Methode, um den Wert von verschachtelten dictionary
Habe ich ein verschachteltes dictionary. Gibt es nur einen Weg, um Werte aus sicher?
try:
example_dict['key1']['key2']
except KeyError:
pass
Oder vielleicht python hat eine Methode wie get()
für verschachtelte Wörterbuch ?
Siehe auch: stackoverflow.com/questions/14692690/...
InformationsquelleAutor Arti | 2014-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie
get
zweimal:Diese zurück
None
wenn entwederkey1
oderkey2
existiert nicht.Beachten Sie, dass dies könnte sich noch erhöhen, ein
AttributeError
wennexample_dict['key1']
vorhanden ist, aber nicht ein dict (oder ein dict-Objekt wie mit einemget
- Methode). Dietry..except
code, den Sie geschrieben wirftTypeError
statt, wennexample_dict['key1']
ist unsubscriptable.Weiterer Unterschied ist, dass die
try...except
Kurzschlüsse sofort nach dem ersten Schlüssel fehlt. Die Kette derget
Anrufe nicht.Wenn Sie möchten, bewahren Sie die syntax,
example_dict['key1']['key2']
aber nicht wollen, dass es jemals erhöhen KeyErrors, dann könnten Sie den Hasher Rezept:Beachten Sie, dass dies gibt eine leere Hasher, wenn ein Schlüssel fehlt.
Seit
Hasher
ist eine Unterklasse vondict
können Sie ein Hasher in viel die gleiche Weise könnte man einedict
. Alle die gleichen Methoden und syntax verfügbar ist, Hashers nur Behandlung von fehlenden Tasten anders.Können Sie konvertieren eine regelmäßige
dict
in eineHasher
wie diese:konvertieren und eine
Hasher
zu einem regelmäßigendict
genauso einfach:Ist eine alternative zum verstecken der Hässlichkeit in einer helper-Funktion:
Also der rest von deinem code bleiben können, relativ gut lesbar:
Einige alternativen finden Sie unter stackoverflow.com/a/19829714/254109
Ich lief in ein problem mit einer ähnlichen Umsetzung. Wenn Sie haben, a = {key1: None} die ersten kommen zurück Keine und dann haben Sie eine Ausnahme ): ich versuche, es herauszufinden, eine Lösung für dieses
Die
safeget
Methode ist in vielerlei Hinsicht nicht sehr sicher, da es überschreibt das ursprüngliche Wörterbuch, d.h. man kann nicht sicher Dinge tun, wiesafeget(dct, 'a', 'b') or safeget(dct, 'a')
.dct[key] ordnet einen neuen Wert in der lokale variable
dct
. Diese nicht mutieren die original dict (so der original-dict ist unberührt vonsafeget
.) Wenn auf der anderen Seitedct[key] = ...
verwendet worden, dann die original-dict würde geändert wurden. In anderen Worten, in Python Namen sind gebunden an Werte. Zuweisung eines neuen Wertes zu einem Namen beeinflussen nicht den alten Wert (es sei denn, es sind keine weiteren Verweise auf den alten Wert, in dem Fall (CPython) es wird Müll gesammelt.)InformationsquelleAutor unutbu
Konnte man auch mit python reduzieren:
InformationsquelleAutor Yoav T
Durch die Kombination all dieser Antwort hier, und kleine änderungen, die ich gemacht, ich denke diese Funktion wäre nützlich. seine sicher, schnell, einfach verwaltbar.
Beispiel :
Perfekt für Jinja2 Vorlagen
Dies ist eine gute Lösung, aber es gibt auch einen Nachteil: selbst wenn der erste Schlüssel nicht verfügbar ist oder der übergebene Wert als das Wörterbuch argument der Funktion ist nicht ein Wörterbuch, das mit der Funktion vom ersten element zum letzten. Im Grunde führt dies in allen Fällen.
deep_get({'a': 1}, "a.b")
gibtNone
aber ich würde erwarten, dass eine Ausnahme wieKeyError
oder etwas anderes.InformationsquelleAutor Yuda Prawira
Gebäude bis auf Yoav Antwort, noch sicherer Ansatz:
InformationsquelleAutor Jose Alban
Während die Reduzierung Ansatz ist ordentlich und kurz, ich denke, eine einfache Schleife ist einfacher zu verstehen. Ich habe auch ein default-parameter.
Als eine übung, um zu verstehen, wie die Reduzierung der one-liner gearbeitet, ich habe die folgenden. Aber letztlich ist das loop-Ansatz scheint intuitiv zu mir.
Nutzung
InformationsquelleAutor zzz
Einer rekursiven Lösung. Es ist nicht das effizienteste, aber ich finde es ein bisschen besser lesbar als die anderen Beispiele, und es verlässt sich nicht auf functools.
Beispiel
Eine mehr Polierte version
InformationsquelleAutor Pithikos
für eine zweite Ebene-Taste abrufen, können Sie dies tun:
InformationsquelleAutor Jacob CUI
Eine einfache Klasse, die können wickeln Sie ein dict, abrufen, basierend auf einem Schlüssel:
Beispiel:
Wenn der Schlüssel nicht vorhanden ist, gibt es
None
standardmäßig. Sie kann überschrieben werden, mit einemdefault=
Schlüssel in derFindDict
wrapper -- zum Beispiel`:InformationsquelleAutor Lee Benson
Nachdem ich diese für immer tief Attribute, die ich aus dem folgenden, um sicher zu bekommen verschachtelte
dict
Werte mithilfe der Punkt-notation. Dies funktioniert für mich, weil meindicts
deserialisiert MongoDB Objekte, so weiß ich die Namen nicht enthalten.
s. Auch in meinen Kontext, ich kann angeben ein falsy-fallback-Wert (None
), dass ich nicht in meine Daten, so kann ich vermeiden das try/except-pattern, wenn Sie die Funktion aufrufen.fallback
ist, nicht verwendet in der Funktion.Beachten Sie, dass dies nicht funktioniert, wenn die Tasten enthalten eine
.
Wenn wir call obj[name], warum nicht obj.get(name, fallback) und vermeiden Sie die try-catch - (wenn Sie wollen, dass die try-catch, dann wieder fallback, nicht Keine)
Danke @153957. Ich reparierte es. Und ja @JW, das funktioniert für meinen Gebrauch Fall. Man könnte hinzufügen, ein
sep=','
keyword arg zu verallgemeinern für gegeben (sep, fallback -) Bedingungen. Und @denvar, wennobj
ist sagen der Typint
nach einer Folge von " reduzieren, dann obj[name] wirft einen TypeError, die ich fangen. Wenn ich obj.get(name) oder obj.get(name, fallback) statt, es würde ein AttributeError, so oder so würde ich brauchen, um zu fangen.InformationsquelleAutor Donny Winston
Ist eine Anpassung der unutbu die Antwort, die ich nützlich in meinem eigenen code:
Erzeugt es einen Wörterbuch-Eintrag für key1, wenn es nicht, dass der Schlüssel bereits, so dass Sie vermeiden, die KeyError. Wenn Sie wollen, um am Ende ein verschachteltes dictionary, das beinhaltet, dass die Taste pairing sowieso, wie ich es Tat, das scheint die einfachste Lösung.
InformationsquelleAutor GenesRus
Da es ein key-error wenn einem der Schlüssel fehlt, ist eine vernünftige Sache zu tun ist, können wir selbst nicht überprüfen Sie es und Holen Sie es als single,:
InformationsquelleAutor Ben Usman