[Lxml-checkins] r33542 - lxml/trunk/src/lxml

scoder at codespeak.net scoder at codespeak.net
Mon Oct 23 10:28:11 CEST 2006


Author: scoder
Date: Mon Oct 23 10:28:10 2006
New Revision: 33542

Modified:
   lxml/trunk/src/lxml/xmlid.pxi
Log:
more cleanup in xmlid.pyx

Modified: lxml/trunk/src/lxml/xmlid.pxi
==============================================================================
--- lxml/trunk/src/lxml/xmlid.pxi	(original)
+++ lxml/trunk/src/lxml/xmlid.pxi	Mon Oct 23 10:28:10 2006
@@ -47,7 +47,7 @@
 
     The dictionary must be instantiated with the root element of a parsed XML
     document, otherwise the behaviour is undefined.  Elements and XML trees
-    that were created or modified through the API are not supported.
+    that were created or modified 'by hand' are not supported.
     """
     cdef _Document _doc
     cdef object _keys
@@ -89,7 +89,7 @@
         return c_id is not NULL
 
     def has_key(self, id_name):
-        return self.__contains__(id_name)
+        return id_name in self
 
     def __cmp__(self, other):
         if other is None:
@@ -118,25 +118,17 @@
         return self._keys[:]
 
     def __iter__(self):
-        keys = self._keys
-        if keys is None:
-            keys = self.keys()
-        return iter(keys)
+        if self._keys is None:
+            self._keys = self._build_keys()
+        return iter(self._keys)
 
     def iterkeys(self):
-        return self.__iter__()
+        return self
 
     def __len__(self):
-        keys = self._keys
-        if keys is None:
-            keys = self.keys()
-        return len(keys)
-
-    cdef object _build_keys(self):
-        keys = []
-        tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
-                         _collectIdHashKeys, <python.PyObject*>keys)
-        return keys
+        if self._keys is None:
+            self._keys = self._build_keys()
+        return len(self._keys)
 
     def items(self):
         if self._items is None:
@@ -144,24 +136,15 @@
         return self._items[:]
 
     def iteritems(self):
-        items = self._items
-        if items is None:
-            items = self.items()
-        return iter(items)
-
-    cdef object _build_items(self):
-        items = []
-        context = (items, self._doc)
-        tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
-                         _collectIdHashItemList, <python.PyObject*>context)
-        return items
+        if self._items is None:
+            self._items = self._build_items()
+        return iter(self._items)
 
     def values(self):
-        items = self._items
-        if items is None:
-            items = self.items()
+        if self._items is None:
+            self._items = self._build_items()
         values = []
-        for item in items:
+        for item in self._items:
             value = python.PyTuple_GET_ITEM(item, 1)
             python.Py_INCREF(value)
             python.PyList_Append(values, value)
@@ -170,6 +153,19 @@
     def itervalues(self):
         return iter(self.values())
 
+    cdef object _build_keys(self):
+        keys = []
+        tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
+                         _collectIdHashKeys, <python.PyObject*>keys)
+        return keys
+
+    cdef object _build_items(self):
+        items = []
+        context = (items, self._doc)
+        tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
+                         _collectIdHashItemList, <python.PyObject*>context)
+        return items
+
 cdef void _collectIdHashItemDict(void* payload, void* context, char* name):
     # collect elements from ID attribute hash table
     cdef tree.xmlID* c_id


More information about the lxml-checkins mailing list