Kaydet (Commit) 7b77188e authored tarafından Martin v. Löwis's avatar Martin v. Löwis

Create _attr/_attrNS lazily.

üst 14aa280d
...@@ -760,6 +760,7 @@ class Namespaces: ...@@ -760,6 +760,7 @@ class Namespaces:
del self._ns_ordered_prefixes[:] del self._ns_ordered_prefixes[:]
if attributes: if attributes:
node._ensure_attributes()
_attrs = node._attrs _attrs = node._attrs
_attrsNS = node._attrsNS _attrsNS = node._attrsNS
for i in range(0, len(attributes), 2): for i in range(0, len(attributes), 2):
......
...@@ -689,13 +689,21 @@ class Element(Node): ...@@ -689,13 +689,21 @@ class Element(Node):
self.childNodes = NodeList() self.childNodes = NodeList()
self.nextSibling = self.previousSibling = None self.nextSibling = self.previousSibling = None
self._attrs = {} # attributes are double-indexed: # Attribute dictionaries are lazily created
self._attrsNS = {} # tagName -> Attribute # attributes are double-indexed:
# URI,localName -> Attribute # tagName -> Attribute
# in the future: consider lazy generation # URI,localName -> Attribute
# of attribute objects this is too tricky # in the future: consider lazy generation
# for now because of headaches with # of attribute objects this is too tricky
# namespaces. # for now because of headaches with
# namespaces.
self._attrs = None
self._attrsNS = None
def _ensure_attributes(self):
if self._attrs is None:
self._attrs = {}
self._attrsNS = {}
def _get_localName(self): def _get_localName(self):
try: try:
...@@ -707,8 +715,9 @@ class Element(Node): ...@@ -707,8 +715,9 @@ class Element(Node):
return self.tagName return self.tagName
def unlink(self): def unlink(self):
for attr in list(self._attrs.values()): if self._attrs is not None:
attr.unlink() for attr in list(self._attrs.values()):
attr.unlink()
self._attrs = None self._attrs = None
self._attrsNS = None self._attrsNS = None
Node.unlink(self) Node.unlink(self)
...@@ -755,14 +764,19 @@ class Element(Node): ...@@ -755,14 +764,19 @@ class Element(Node):
attr.nodeName = qualifiedName attr.nodeName = qualifiedName
def getAttributeNode(self, attrname): def getAttributeNode(self, attrname):
if self._attrs is None:
return None
return self._attrs.get(attrname) return self._attrs.get(attrname)
def getAttributeNodeNS(self, namespaceURI, localName): def getAttributeNodeNS(self, namespaceURI, localName):
if self._attrsNS is None:
return None
return self._attrsNS.get((namespaceURI, localName)) return self._attrsNS.get((namespaceURI, localName))
def setAttributeNode(self, attr): def setAttributeNode(self, attr):
if attr.ownerElement not in (None, self): if attr.ownerElement not in (None, self):
raise xml.dom.InuseAttributeErr("attribute node already owned") raise xml.dom.InuseAttributeErr("attribute node already owned")
self._ensure_attributes()
old1 = self._attrs.get(attr.name, None) old1 = self._attrs.get(attr.name, None)
if old1 is not None: if old1 is not None:
self.removeAttributeNode(old1) self.removeAttributeNode(old1)
...@@ -781,6 +795,8 @@ class Element(Node): ...@@ -781,6 +795,8 @@ class Element(Node):
setAttributeNodeNS = setAttributeNode setAttributeNodeNS = setAttributeNode
def removeAttribute(self, name): def removeAttribute(self, name):
if self._attrsNS is None:
raise xml.dom.NotFoundErr()
try: try:
attr = self._attrs[name] attr = self._attrs[name]
except KeyError: except KeyError:
...@@ -788,6 +804,8 @@ class Element(Node): ...@@ -788,6 +804,8 @@ class Element(Node):
self.removeAttributeNode(attr) self.removeAttributeNode(attr)
def removeAttributeNS(self, namespaceURI, localName): def removeAttributeNS(self, namespaceURI, localName):
if self._attrsNS is None:
raise xml.dom.NotFoundErr()
try: try:
attr = self._attrsNS[(namespaceURI, localName)] attr = self._attrsNS[(namespaceURI, localName)]
except KeyError: except KeyError:
...@@ -810,9 +828,13 @@ class Element(Node): ...@@ -810,9 +828,13 @@ class Element(Node):
removeAttributeNodeNS = removeAttributeNode removeAttributeNodeNS = removeAttributeNode
def hasAttribute(self, name): def hasAttribute(self, name):
if self._attrs is None:
return False
return name in self._attrs return name in self._attrs
def hasAttributeNS(self, namespaceURI, localName): def hasAttributeNS(self, namespaceURI, localName):
if self._attrsNS is None:
return False
return (namespaceURI, localName) in self._attrsNS return (namespaceURI, localName) in self._attrsNS
def getElementsByTagName(self, name): def getElementsByTagName(self, name):
...@@ -853,6 +875,7 @@ class Element(Node): ...@@ -853,6 +875,7 @@ class Element(Node):
writer.write("/>%s"%(newl)) writer.write("/>%s"%(newl))
def _get_attributes(self): def _get_attributes(self):
self._ensure_attributes()
return NamedNodeMap(self._attrs, self._attrsNS, self) return NamedNodeMap(self._attrs, self._attrsNS, self)
def hasAttributes(self): def hasAttributes(self):
...@@ -890,6 +913,7 @@ defproperty(Element, "localName", ...@@ -890,6 +913,7 @@ defproperty(Element, "localName",
def _set_attribute_node(element, attr): def _set_attribute_node(element, attr):
_clear_id_cache(element) _clear_id_cache(element)
element._ensure_attributes()
element._attrs[attr.name] = attr element._attrs[attr.name] = attr
element._attrsNS[(attr.namespaceURI, attr.localName)] = attr element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment