"Defaultdict" als reguläres "dict" ausgeben
ich benutzedefaultdict(set)
ein internes Mapping in einer sehr großen Datenstruktur aufzufüllen. Nach dem Auffüllen ist die gesamte Struktur (einschließlich des Mappings) dem Client-Code ausgesetzt. Zu diesem Zeitpunkt möchte ich nicht, dass jemand das Mapping ändert.
Und niemand tut dies absichtlich. Manchmal verweist der Clientcode jedoch versehentlich auf ein Element, das nicht vorhanden ist. Zu diesem Zeitpunkt hätte ein normales Wörterbuch ausgelöstKeyError
, aber da ist das mappingdefaultdict
erstellt es einfach ein neues Element (eine leere Menge) an diesem Schlüssel. Das ist ziemlich schwer zu fassen, da alles still läuft. Aber ich muss sicherstellen, dass dies nicht passiert (die Semantik bricht tatsächlich nicht zusammen, aber das Mapping wächst auf eine riesige Größe).
Was soll ich machen? Ich kann diese Auswahl sehen:
Suchen Sie alle Instanzen im aktuellen und zukünftigen Clientcode, in denen eine Wörterbuchsuche für die Zuordnung durchgeführt wird, und konvertieren Sie sie inmapping.get(k, {})
stattdessen. Das ist einfach schrecklich.
"Einfrieren"defaultdict
Nachdem die Datenstruktur vollständig initialisiert wurde, konvertieren Sie sie indict
. (Ich weiß, dass es nicht wirklich eingefroren ist, aber ich vertraue darauf, dass der Client-Code nicht wirklich schreibtmapping[k] = v
.) Unelegant und ein großer Leistungstreffer.
Wickelndefaultdict
in eindict
Schnittstelle. Was ist ein eleganter Weg, das zu tun? Ich befürchte jedoch, dass die Leistung erheblich beeinträchtigt wird (diese Suche wird häufig in engen Schleifen verwendet).
Unterklassedefaultdict
und fügen Sie eine Methode hinzu, die alle "herunterfährt"defaultdict
Funktionen, so dass es sich so verhält, als ob es ein normaler istdict
. Es ist eine Variante von 3 oben, aber ich bin nicht sicher, ob es noch schneller ist. Und ich weiß nicht, ob es machbar ist, ohne sich auf die Implementierungsdetails zu verlassen.
Verwenden Sie regelmäßigdict
Schreiben Sie in der Datenstruktur den gesamten Code neu, um zunächst zu überprüfen, ob sich das Element im Wörterbuch befindet, und fügen Sie es hinzu, wenn dies nicht der Fall ist. Nicht gut.