diff options
author | scoder <none@none> | 2006-10-23 10:28:10 +0200 |
---|---|---|
committer | scoder <none@none> | 2006-10-23 10:28:10 +0200 |
commit | 29e99f0f43c3b2f93c6be77ce339bb23ca7b1718 (patch) | |
tree | 537cf4649f4134721ca9f85264299dc5186b3c71 /src/lxml/xmlid.pxi | |
parent | b1b6db94aa6eeec22370009a563609f1cc46af01 (diff) | |
download | python-lxml-29e99f0f43c3b2f93c6be77ce339bb23ca7b1718.tar.gz |
[svn r1972] more cleanup in xmlid.pyx
--HG--
branch : trunk
Diffstat (limited to 'src/lxml/xmlid.pxi')
-rw-r--r-- | src/lxml/xmlid.pxi | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/src/lxml/xmlid.pxi b/src/lxml/xmlid.pxi index dd27bb52..917a0562 100644 --- a/src/lxml/xmlid.pxi +++ b/src/lxml/xmlid.pxi @@ -47,7 +47,7 @@ cdef class _IDDict: 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 @@ cdef class _IDDict: 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 @@ cdef class _IDDict: 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 @@ cdef class _IDDict: 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 @@ cdef class _IDDict: 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 |