Was ist der Zweck der Sammlungen.ChainMap?
In Python 3.3 ChainMap
- Klasse wurde Hinzugefügt, um die Sammlungen
Modul:
Einen ChainMap Klasse wird bereitgestellt, um schnell verknüpfen eine Anzahl von Zuordnungen
so können Sie als eine Einheit behandelt. Es ist oft viel schneller als
erstellen eines neuen Wörterbuchs und läuft mehrere update () - Aufrufe.
Beispiel:
>>> from collections import ChainMap
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = ChainMap(y, x)
>>> for k, v in z.items():
print(k, v)
a 1
c 11
b 10
Es wurde motiviert durch dieses Problem und öffentlich gemacht diese eine (keine PEP
erstellt wurde).
Soweit ich das verstanden habe, ist es eine alternative, um ein zusätzliches Wörterbuch und Pflege es mit update()
s.
Die Fragen:
- Was nützt Fällen nicht
ChainMap
cover? - Gibt es irgendwelche realen Welt Beispiele von
ChainMap
? - Ist es in third-party-Bibliotheken, die eingeschaltet, um Python ist3?
Bonus-Frage: gibt es eine Möglichkeit, es zu benutzen auf Python2.x?
Ich habe gehört, über die es in Transformieren-Code in Schöne, Idiomatische Python
PyCon Vortrag von Raymond Hettinger, und ich möchte hinzufügen, dass es mein toolkit, aber mir fehlt im das Verständnis, Wann sollte ich es verwenden.
- Ich bin auch versucht, die Lücke zu füllen: es gibt Fragen,
defaultdict
,namedtuple
...aber es gibt keine überChainMap
. Also, für mich ist dies ein Weg, um einen Beitrag auch. Vielen Dank im Voraus. - Jedes mal, wenn Sie aktualisieren müssen Sie eine Zuordnung und möglicherweise umkehren möchten Sie diese updates ist die perfekte Zeit.
- Real-world use-case: die GET und POST parameter-mappings in ein web-framework, bietet eine kombinierte Sicht auf zwei unterschiedliche und separate Wörterbücher.
- Wie für die Verwendung in 2.x, die Quellcode wie es aussieht, könnte möglicherweise Nur Funktioniert, allerdings habe ich nicht versucht
- FWIW, es gibt einen Vorläufer bereits in Python2.7:
from ConfigParser import _ChainMap as ChainMap
. - danke für die nette und hilfreiche Kommentare und für die
ChainMap
selbst. Sie hätte eine gute Antwort aus der Kette der Kommentare 🙂 - wenn Sie möchten, zu importieren 2.7 wie Raymond schon sagt, es ist eigentlich
_Chainmap
(beachten Sie die groß-und Kleinschreibung m) - guter Fang, danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich wie @b4hand Beispiele, und zwar habe ich in der Vergangenheit verwendet ChainMap-ähnliche Strukturen (nicht aber ChainMap sich) für die zwei Zwecke, die er erwähnt: multi-Schichten-Konfiguration überschreibt und variable stack - /scope-emulation.
Ich möchte an dieser Stelle auf zwei andere Beweggründe/Vorteile/Unterschiede von
ChainMap
im Vergleich zu einem dict-update-Schleife, somit nur die Lagerung der "endgültige" version":Weitere Informationen: da ein ChainMap Struktur ist "geschichtet", es unterstützt die Beantwortung von Fragen wie: Bin ich immer die "default" - Wert, oder eine überschriebene ein? Was ist die ursprüngliche ("default") Wert? Auf welchem Niveau hat der Wert überschrieben bekommen (Kreditaufnahme @b4hand config-example: user-config oder über die Befehlszeile überschreibt)? Mit einem einfachen dict, die benötigten Informationen für die Beantwortung dieser Fragen ist bereits verloren.
Geschwindigkeit Nachteil: angenommen, Sie haben
N
Schichten und in den meistenM
Schlüssel in jeder Konstruktion einer ChainMap nimmtO(N)
und jede SucheO(N)
worst-case[*], während der Bau von ein dict mit einer update-Schleife nimmtO(NM)
und jede SucheO(1)
. Dies bedeutet, dass, wenn Sie bauen oft und nur ein paar lookups jeder Zeit, oder wennM
ist groß, ChainMap ist faul-Bau Ansatz funktioniert zu Ihren Gunsten.[*] Die Analyse in (2) wird davon ausgegangen dict-Zugang ist
O(1)
, wenn in der Tat es istO(1)
im Durchschnitt, undO(M)
schlimmsten Fall. Weitere details finden Sie hier.Konnte ich sehen, mit
ChainMap
für ein configuration-Objekt, wo Sie mehrere Bereiche der Konfiguration wie Kommandozeilen-Optionen, Benutzer-Konfigurations-Datei und eine Konfigurationsdatei. Seit lookups sind sortiert nach der Reihenfolge, in der Konstruktor-argument haben, können Sie überschreiben die Einstellungen auf niedrigere Bereiche. Habe ich persönlich nicht benutzt oder gesehenChainMap
verwendet, aber das ist nicht verwunderlich, denn es ist eine relativ neue zusätzlich zu den standard-Bibliothek.Könnte es auch nützlich sein für die Emulation stack-frames, wo Sie push-und pop-variable Bindungen, wenn Sie versuchen zu implementieren, die einen lexikalischen scope selbst.
Den standard-Bibliothek-Dokumentation für ChainMap geben einige Beispiele und links zu ähnlichen Implementierungen in third-party-Bibliotheken. Konkret geht es um Namen Django ' s Kontext-Klasse und Enthought ist MultiContext Klasse.
Ich nehme einen Riss an:
Chainmap sieht aus wie ein sehr einfach-so eine Art der Abstraktion. Es ist eine gute Lösung für eine sehr spezielle Art von problem. Ich schlage vor, diesen use-case.
Wenn Sie haben:
Dann,
Sie sollten erwägen, mit einem chainmap zu erstellen, einen Blick auf die Sammlung von Zuordnungen.
Dies ist aber bei allen nach-der-Tatsache Begründung. Die Python-Jungs hatte ein problem, kam auf eine gute Lösung im Hinblick auf Ihre code -, dann hat einige zusätzliche Arbeit zu abstrahieren, Ihre Lösung, so könnten wir verwenden, wenn wir wählen. Mehr macht zu Ihnen. Aber ob es geeignet ist für Ihr problem ist bis zu Ihnen zu entscheiden.
Zu unvollkommen beantworten Ihre:
Jedoch im Hinterkopf behalten, dass dies nicht eine echte
ChainMap
es erbt vonDictMixin
und definiert nur:Seine Umsetzung scheint auch nicht besonders effizient.