Identity Dictionary / Set in Python?
Verfasst: Mittwoch 2. Januar 2008, 13:09
Normale dicts/sets in Python speichern Objekte basierend auf __hash__ und __eq__ bzw. __cmp__. Insbesondere kann man keine Listen als Schlüssel benutzen, da diese "unhashable" sind. Manchmal will man aber die Objektidentität als Schlüssel benutzen, z.B. wenn ich prüfen will, ob ich ein Objekt bereits verarbeitet habe - egal ob es __eq__ zu einem anderen ist oder nicht.
Gibt's da etwas Fertiges für Python?
Für ein identityset habe ich folgenden Vorschlag:
d.h., ich nutzt id(obj) als Schlüssel - in der Hoffnung, das ist jeweils eine einzigartige Zahl. Ich muss mir das Objekt selbst merken, damit es mir nicht bei einer GC abhanden kommt. Für ein identitydict könnte man vielleicht sowas benutzen:
Ich möchte mir aber nicht die Arbeit einer vollständigen Implementierung machen (zudem ich gar nicht wüsste, wie ich das pickle-bar hinbekomme), wenn das andere schon für mich gemacht haben ;)
Stefan
Gibt's da etwas Fertiges für Python?
Für ein identityset habe ich folgenden Vorschlag:
Code: Alles auswählen
class identityset(dict):
def add(self, obj): self[id(obj)] = obj
def __iter__(self): return self.itervalues()
Code: Alles auswählen
class identitydict(dict):
def __getitem__(self, obj): return self[id(obj)][1]
def __setitem__(self, obj, value): self[id(obj)] = (obj, value)
Stefan