Spaces:
Running
Running
"""Python version compatibility support for minidom. | |
This module contains internal implementation details and | |
should not be imported; use xml.dom.minidom instead. | |
""" | |
# This module should only be imported using "import *". | |
# | |
# The following names are defined: | |
# | |
# NodeList -- lightest possible NodeList implementation | |
# | |
# EmptyNodeList -- lightest possible NodeList that is guaranteed to | |
# remain empty (immutable) | |
# | |
# StringTypes -- tuple of defined string types | |
# | |
# defproperty -- function used in conjunction with GetattrMagic; | |
# using these together is needed to make them work | |
# as efficiently as possible in both Python 2.2+ | |
# and older versions. For example: | |
# | |
# class MyClass(GetattrMagic): | |
# def _get_myattr(self): | |
# return something | |
# | |
# defproperty(MyClass, "myattr", | |
# "return some value") | |
# | |
# For Python 2.2 and newer, this will construct a | |
# property object on the class, which avoids | |
# needing to override __getattr__(). It will only | |
# work for read-only attributes. | |
# | |
# For older versions of Python, inheriting from | |
# GetattrMagic will use the traditional | |
# __getattr__() hackery to achieve the same effect, | |
# but less efficiently. | |
# | |
# defproperty() should be used for each version of | |
# the relevant _get_<property>() function. | |
__all__ = ["NodeList", "EmptyNodeList", "StringTypes", "defproperty"] | |
import xml.dom | |
StringTypes = (str,) | |
class NodeList(list): | |
__slots__ = () | |
def item(self, index): | |
if 0 <= index < len(self): | |
return self[index] | |
def _get_length(self): | |
return len(self) | |
def _set_length(self, value): | |
raise xml.dom.NoModificationAllowedErr( | |
"attempt to modify read-only attribute 'length'") | |
length = property(_get_length, _set_length, | |
doc="The number of nodes in the NodeList.") | |
# For backward compatibility | |
def __setstate__(self, state): | |
if state is None: | |
state = [] | |
self[:] = state | |
class EmptyNodeList(tuple): | |
__slots__ = () | |
def __add__(self, other): | |
NL = NodeList() | |
NL.extend(other) | |
return NL | |
def __radd__(self, other): | |
NL = NodeList() | |
NL.extend(other) | |
return NL | |
def item(self, index): | |
return None | |
def _get_length(self): | |
return 0 | |
def _set_length(self, value): | |
raise xml.dom.NoModificationAllowedErr( | |
"attempt to modify read-only attribute 'length'") | |
length = property(_get_length, _set_length, | |
doc="The number of nodes in the NodeList.") | |
def defproperty(klass, name, doc): | |
get = getattr(klass, ("_get_" + name)) | |
def set(self, value, name=name): | |
raise xml.dom.NoModificationAllowedErr( | |
"attempt to modify read-only attribute " + repr(name)) | |
assert not hasattr(klass, "_set_" + name), \ | |
"expected not to find _set_" + name | |
prop = property(get, set, doc=doc) | |
setattr(klass, name, prop) | |