home *** CD-ROM | disk | FTP | other *** search
- """Python version compatibility support for minidom."""
-
- # This module should only be imported using "import *".
- #
- # The following names are defined:
- #
- # NodeList -- lightest possible NodeList implementation
- #
- # EmptyNodeList -- lightest possible NodeList that is guarateed 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
-
- try:
- unicode
- except NameError:
- StringTypes = type(''),
- else:
- StringTypes = type(''), type(unicode(''))
-
-
- 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.")
-
- def __getstate__(self):
- return list(self)
-
- def __setstate__(self, 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)).im_func
- 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)
-