1
"""Python version compatibility support for minidom."""
3
# This module should only be imported using "import *".
5
# The following names are defined:
7
# NodeList -- lightest possible NodeList implementation
9
# EmptyNodeList -- lightest possible NodeList that is guarateed to
10
# remain empty (immutable)
12
# StringTypes -- tuple of defined string types
14
# defproperty -- function used in conjunction with GetattrMagic;
15
# using these together is needed to make them work
16
# as efficiently as possible in both Python 2.2+
17
# and older versions. For example:
19
# class MyClass(GetattrMagic):
20
# def _get_myattr(self):
23
# defproperty(MyClass, "myattr",
24
# "return some value")
26
# For Python 2.2 and newer, this will construct a
27
# property object on the class, which avoids
28
# needing to override __getattr__(). It will only
29
# work for read-only attributes.
31
# For older versions of Python, inheriting from
32
# GetattrMagic will use the traditional
33
# __getattr__() hackery to achieve the same effect,
34
# but less efficiently.
36
# defproperty() should be used for each version of
37
# the relevant _get_<property>() function.
39
__all__ = ["NodeList", "EmptyNodeList", "StringTypes", "defproperty"]
49
def item(self, index):
50
if 0 <= index < len(self):
53
def _get_length(self):
56
def _set_length(self, value):
57
raise xml.dom.NoModificationAllowedErr(
58
"attempt to modify read-only attribute 'length'")
60
length = property(_get_length, _set_length,
61
doc="The number of nodes in the NodeList.")
63
def __getstate__(self):
66
def __setstate__(self, state):
70
class EmptyNodeList(tuple):
73
def __add__(self, other):
78
def __radd__(self, other):
83
def item(self, index):
86
def _get_length(self):
89
def _set_length(self, value):
90
raise xml.dom.NoModificationAllowedErr(
91
"attempt to modify read-only attribute 'length'")
93
length = property(_get_length, _set_length,
94
doc="The number of nodes in the NodeList.")
97
def defproperty(klass, name, doc):
98
get = getattr(klass, ("_get_" + name))
99
def set(self, value, name=name):
100
raise xml.dom.NoModificationAllowedErr(
101
"attempt to modify read-only attribute " + repr(name))
102
assert not hasattr(klass, "_set_" + name), \
103
"expected not to find _set_" + name
104
prop = property(get, set, doc=doc)
105
setattr(klass, name, prop)