diff options
Diffstat (limited to 'Lib/xmlcore/dom/minicompat.py')
-rw-r--r-- | Lib/xmlcore/dom/minicompat.py | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/Lib/xmlcore/dom/minicompat.py b/Lib/xmlcore/dom/minicompat.py new file mode 100644 index 0000000..364ca45 --- /dev/null +++ b/Lib/xmlcore/dom/minicompat.py @@ -0,0 +1,184 @@ +"""Python version compatibility support for minidom.""" + +# This module should only be imported using "import *". +# +# The following names are defined: +# +# isinstance -- version of the isinstance() function that accepts +# tuples as the second parameter regardless of the +# Python version +# +# NodeList -- lightest possible NodeList implementation +# +# EmptyNodeList -- lightest possible NodeList that is guarateed to +# remain empty (immutable) +# +# StringTypes -- tuple of defined string types +# +# GetattrMagic -- base class used to make _get_<attr> be magically +# invoked when available +# 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. +# +# NewStyle -- base class to cause __slots__ to be honored in +# the new world +# +# True, False -- only for Python 2.2 and earlier + +__all__ = ["NodeList", "EmptyNodeList", "NewStyle", + "StringTypes", "defproperty", "GetattrMagic"] + +import xmlcore.dom + +try: + unicode +except NameError: + StringTypes = type(''), +else: + StringTypes = type(''), type(unicode('')) + + +# define True and False only if not defined as built-ins +try: + True +except NameError: + True = 1 + False = 0 + __all__.extend(["True", "False"]) + + +try: + isinstance('', StringTypes) +except TypeError: + # + # Wrap isinstance() to make it compatible with the version in + # Python 2.2 and newer. + # + _isinstance = isinstance + def isinstance(obj, type_or_seq): + try: + return _isinstance(obj, type_or_seq) + except TypeError: + for t in type_or_seq: + if _isinstance(obj, t): + return 1 + return 0 + __all__.append("isinstance") + + +if list is type([]): + 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 xmlcore.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 xmlcore.dom.NoModificationAllowedErr( + "attempt to modify read-only attribute 'length'") + + length = property(_get_length, _set_length, + doc="The number of nodes in the NodeList.") + +else: + def NodeList(): + return [] + + def EmptyNodeList(): + return [] + + +try: + property +except NameError: + def defproperty(klass, name, doc): + # taken care of by the base __getattr__() + pass + + class GetattrMagic: + def __getattr__(self, key): + if key.startswith("_"): + raise AttributeError, key + + try: + get = getattr(self, "_get_" + key) + except AttributeError: + raise AttributeError, key + return get() + + class NewStyle: + pass + +else: + def defproperty(klass, name, doc): + get = getattr(klass, ("_get_" + name)).im_func + def set(self, value, name=name): + raise xmlcore.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) + + class GetattrMagic: + pass + + NewStyle = object |