Viewing file: sets.py (3.61 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
"""sets module
This module provides some Set classes for dealing with MySQL data. """
class Set:
"""A simple class for handling sets. Sets are immutable in the same way numbers are.""" def __init__(self, *values): """Use values to initialize the Set.""" self._values = values
def __contains__(self, value): return value in self._values and 1 or 0 def __str__(self): """Returns the values as a comma-separated string.""" return ','.join([ str(x) for x in self._values])
def __repr__(self): return "%s%s" % (self.__class__.__name__, `self._values`) def __or__(self, other): """Union.""" values = list(self._values) if isinstance(other, Set): for v in other._values: if v not in values: values.append(v) elif other not in self._values: values.append(other) return self.__class__(*values)
__add__ = __or__ def __sub__(self, other): values = list(self._values) if isinstance(other, Set): for v in other._values: if v in values: values.remove(v) elif other in self: values.remove(other) return self.__class__(*values)
def __and__(self, other): "Intersection." values = [] if isinstance(other, Set): for v in self._values: if v in other: values.append(v) elif other in self: values.append(other) return self.__class__(*values)
__mul__ = __and__ def __xor__(self, other): "Intersection's complement." return (self|other)-(self&other)
def __getitem__(self, n): return self._values[n]
def __getslice__(self, n1, n2): return self._values[n1:n2] def __len__(self): return len(self._values) def __hash__(self): return hash(self._values) def __cmp__(self, other): if isinstance(other, Set): if not self ^ other: return 0 elif self & other == self: return 1 else: return -1 elif other in self._values: return 0 elif other > self._values: return 1 else: return -1
# rich comparison operators for Python 2.1 and up
def __ne__(self, other): return self ^ other def __eq__(self, other): if not self != other: return self else: return self.__class__() def __le__(self, other): return self & other == self
def __lt__(self, other): if self <= other and self ^ other: return self else: return self.__class__()
def __ge__(self, other): return self & other == other
def __gt__(self, other): if self >= other and self ^ other: return self else: return self.__class__()
class DBAPISet(Set):
"""A special type of set for which A == x is true if A is a DBAPISet and x is a member of that set."""
# Note that Set.__cmp__ works perfectly well in this case, if # we are using < Python 2.1. It's just broken for <, >, etc. def __ne__(self, other): if isinstance(other, Set): # yes, Set return self % other elif other in self._values: return 0 else: return 1
def __eq__(self, other): if self != other: return self.__class__() else: return self
|