mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
Create _attr/_attrNS lazily.
This commit is contained in:
parent
14aa280de2
commit
7b77188e89
2 changed files with 34 additions and 9 deletions
|
@ -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):
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
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",
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue