⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compatsets.py

📁 用python实现的邮件过滤器
💻 PY
📖 第 1 页 / 共 2 页
字号:
        try:            return element in self._data        except TypeError:            transform = getattr(element, "_as_temporarily_immutable", None)            if transform is None:                raise # re-raise the TypeError exception we caught            return transform() in self._data    # Subset and superset test    def issubset(self, other):        """Report whether another set contains this set."""        self._binary_sanity_check(other)        if len(self) > len(other):  # Fast check for obvious cases            return False        otherdata = other._data        for elt in self:            if elt not in otherdata:                return False        return True    def issuperset(self, other):        """Report whether this set contains another set."""        self._binary_sanity_check(other)        if len(self) < len(other):  # Fast check for obvious cases            return False        selfdata = self._data        for elt in other:            if elt not in selfdata:                return False        return True    # Inequality comparisons using the is-subset relation.    __le__ = issubset    __ge__ = issuperset    def __lt__(self, other):        self._binary_sanity_check(other)        return len(self) < len(other) and self.issubset(other)    def __gt__(self, other):        self._binary_sanity_check(other)        return len(self) > len(other) and self.issuperset(other)    # Assorted helpers    def _binary_sanity_check(self, other):        # Check that the other argument to a binary operation is also        # a set, raising a TypeError otherwise.        if not isinstance(other, BaseSet):            raise TypeError, "Binary operation only permitted between sets"    def _compute_hash(self):        # Calculate hash code for a set by xor'ing the hash codes of        # the elements.  This ensures that the hash code does not depend        # on the order in which elements are added to the set.  This is        # not called __hash__ because a BaseSet should not be hashable;        # only an ImmutableSet is hashable.        result = 0        for elt in self:            result ^= hash(elt)        return result    def _update(self, iterable):        # The main loop for update() and the subclass __init__() methods.        data = self._data        # Use the fast update() method when a dictionary is available.        if isinstance(iterable, BaseSet):            data.update(iterable._data)            return        if isinstance(iterable, dict):            data.update(iterable)            return        value = True        it = iter(iterable)        while True:            try:                for element in it:                    data[element] = value                return            except TypeError:                transform = getattr(element, "_as_immutable", None)                if transform is None:                    raise # re-raise the TypeError exception we caught                data[transform()] = valueclass ImmutableSet(BaseSet):    """Immutable set class."""    __slots__ = ['_hashcode']    # BaseSet + hashing    def __init__(self, iterable=None):        """Construct an immutable set from an optional iterable."""        self._hashcode = None        self._data = {}        if iterable is not None:            self._update(iterable)    def __hash__(self):        if self._hashcode is None:            self._hashcode = self._compute_hash()        return self._hashcodeclass Set(BaseSet):    """ Mutable set class."""    __slots__ = []    # BaseSet + operations requiring mutability; no hashing    def __init__(self, iterable=None):        """Construct a set from an optional iterable."""        self._data = {}        if iterable is not None:            self._update(iterable)    def __hash__(self):        """A Set cannot be hashed."""        # We inherit object.__hash__, so we must deny this explicitly        raise TypeError, "Can't hash a Set, only an ImmutableSet."    # In-place union, intersection, differences.    # Subtle:  The xyz_update() functions deliberately return None,    # as do all mutating operations on built-in container types.    # The __xyz__ spellings have to return self, though.    def __ior__(self, other):        """Update a set with the union of itself and another."""        self._binary_sanity_check(other)        self._data.update(other._data)        return self    def union_update(self, other):        """Update a set with the union of itself and another."""        self |= other    def __iand__(self, other):        """Update a set with the intersection of itself and another."""        self._binary_sanity_check(other)        self._data = (self & other)._data        return self    def intersection_update(self, other):        """Update a set with the intersection of itself and another."""        self &= other    def __ixor__(self, other):        """Update a set with the symmetric difference of itself and another."""        self._binary_sanity_check(other)        data = self._data        value = True        for elt in other:            if elt in data:                del data[elt]            else:                data[elt] = value        return self    def symmetric_difference_update(self, other):        """Update a set with the symmetric difference of itself and another."""        self ^= other    def __isub__(self, other):        """Remove all elements of another set from this set."""        self._binary_sanity_check(other)        data = self._data        for elt in other:            if elt in data:                del data[elt]        return self    def difference_update(self, other):        """Remove all elements of another set from this set."""        self -= other    # Python dict-like mass mutations: update, clear    def update(self, iterable):        """Add all values from an iterable (such as a list or file)."""        self._update(iterable)    def clear(self):        """Remove all elements from this set."""        self._data.clear()    # Single-element mutations: add, remove, discard    def add(self, element):        """Add an element to a set.        This has no effect if the element is already present.        """        try:            self._data[element] = True        except TypeError:            transform = getattr(element, "_as_immutable", None)            if transform is None:                raise # re-raise the TypeError exception we caught            self._data[transform()] = True    def remove(self, element):        """Remove an element from a set; it must be a member.        If the element is not a member, raise a KeyError.        """        try:            del self._data[element]        except TypeError:            transform = getattr(element, "_as_temporarily_immutable", None)            if transform is None:                raise # re-raise the TypeError exception we caught            del self._data[transform()]    def discard(self, element):        """Remove an element from a set if it is a member.        If the element is not a member, do nothing.        """        try:            self.remove(element)        except KeyError:            pass    def pop(self):        """Remove and return an arbitrary set element."""        return self._data.popitem()[0]    def _as_immutable(self):        # Return a copy of self as an immutable set        return ImmutableSet(self)    def _as_temporarily_immutable(self):        # Return self wrapped in a temporarily immutable set        return _TemporarilyImmutableSet(self)class _TemporarilyImmutableSet(BaseSet):    # Wrap a mutable set as if it was temporarily immutable.    # This only supplies hashing and equality comparisons.    def __init__(self, set):        self._set = set        self._data = set._data  # Needed by ImmutableSet.__eq__()    def __hash__(self):        return self._set._compute_hash()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -