Viewing file: minicompat.py (5.16 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: # # 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 xml.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 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.")
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 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)
class GetattrMagic: pass
NewStyle = object
|