[Python-de] Nicht-Hashbare Elemente schnell zugreifen

Diez B. Roggisch deets at web.de
Mon Jun 26 13:35:30 CEST 2006


Hallo,

> > ich hab hier ein etwas verzwicktes Problem. Ich moechte in ein
> > Dictionary mit nicht-hashbaren Objekte indizieren, prinzipiell zwar
> > machbar mit id(), aber die Objekte sind aus einer C-Library (also
> > gewrappte C-Objekte) und werden immer wieder neu erzeugt. Ich bekomme
> > also fuer dasselbe Objekt aus der Library 2 verschiedene Python Objekte.
> > Deswegen hatte ich nun schon einen Vergleichsoperator fuer diese Objekte
> > geschrieben (auf C-Level kann man die Teile vergleichen).
>
> Spricht was dagegen, auch noch __hash__ zu implementieren? Hab das gerade
> mal für lxml gemacht, basierend auf der Adresse des C Objektes.
> Funktioniert wunderbar:
>
> cdef class Element:
>     cdef xmlNode* _c_node
>     def __hash__(self):
>         return python.PyLong_FromVoidPtr(self._c_node)
>
> Solltest du den Autoren der libxml2 bindings vorschlagen. (Danke übrigens
> für die Idee). In lxml ist sowas weniger wichtig, da ohnehin während der
> Lebensdauer von Element Objekten immer das selbe Objekt zurückgeliefert
> wird. Solange sie also in einer Hash-Tabelle sind, wirst du auch immer das
> selbe Objekt (und damit den selben Hash-Key) von lxml bekommen. Nach dem,
> was du schreibst, scheint libxml2 diese Optimierung  nicht zu haben.

Noch als addendum: anders gehts auch nicht  - das einzige "auto-id"-Kriterium 
wäre der Pfad im XML-Dokument (also root/child[5]/subchild[3]). Und den 
errechnet man auch nicht in weniger als O(n) mit n = #(Elemente im Dokument)

MfG Diez