| Viewing file:  minicompat.py (3.28 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
"""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 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
 
 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.")
 
 # 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)).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)
 
 |