summaryrefslogtreecommitdiff
path: root/Lib/weakref.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2008-02-05 00:20:01 +0000
committerRaymond Hettinger <python@rcn.com>2008-02-05 00:20:01 +0000
commit93fa608626562d3925104f98372dbdd27aeafcf0 (patch)
tree2f2b204763333a3e637e3effa274f3b8895c9124 /Lib/weakref.py
parent2add352c435f8973274f16c37eb6246f86799722 (diff)
downloadcpython-git-93fa608626562d3925104f98372dbdd27aeafcf0.tar.gz
Moved WeakSet into a bootstap module use by abc.py.
This makes it possible to use ABCs in weakref.py (which will be done in a later checkin).
Diffstat (limited to 'Lib/weakref.py')
-rw-r--r--Lib/weakref.py109
1 files changed, 3 insertions, 106 deletions
diff --git a/Lib/weakref.py b/Lib/weakref.py
index c54a0729d4..a9c05d82d9 100644
--- a/Lib/weakref.py
+++ b/Lib/weakref.py
@@ -20,12 +20,14 @@ from _weakref import (
ProxyType,
ReferenceType)
+from _weakrefset import WeakSet
ProxyTypes = (ProxyType, CallableProxyType)
__all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs",
"WeakKeyDictionary", "ReferenceType", "ProxyType",
- "CallableProxyType", "ProxyTypes", "WeakValueDictionary"]
+ "CallableProxyType", "ProxyTypes", "WeakValueDictionary",
+ "WeakSet"]
class WeakValueDictionary(UserDict.UserDict):
@@ -337,108 +339,3 @@ class WeakKeyDictionary(UserDict.UserDict):
d[ref(key, self._remove)] = value
if len(kwargs):
self.update(kwargs)
-
-
-class WeakSet:
- def __init__(self, data=None):
- self.data = set()
- def _remove(item, selfref=ref(self)):
- self = selfref()
- if self is not None:
- self.data.discard(item)
- self._remove = _remove
- if data is not None:
- self.update(data)
-
- def __iter__(self):
- for itemref in self.data:
- item = itemref()
- if item is not None:
- yield item
-
- def __contains__(self, item):
- return ref(item) in self.data
-
- def __reduce__(self):
- return (self.__class__, (list(self),),
- getattr(self, '__dict__', None))
-
- def add(self, item):
- self.data.add(ref(item, self._remove))
-
- def clear(self):
- self.data.clear()
-
- def copy(self):
- return self.__class__(self)
-
- def pop(self):
- while True:
- itemref = self.data.pop()
- item = itemref()
- if item is not None:
- return item
-
- def remove(self, item):
- self.data.remove(ref(item))
-
- def discard(self, item):
- self.data.discard(ref(item))
-
- def update(self, other):
- if isinstance(other, self.__class__):
- self.data.update(other.data)
- else:
- for element in other:
- self.add(element)
- __ior__ = update
-
- # Helper functions for simple delegating methods.
- def _apply(self, other, method):
- if not isinstance(other, self.__class__):
- other = self.__class__(other)
- newdata = method(other.data)
- newset = self.__class__()
- newset.data = newdata
- return newset
-
- def _apply_mutate(self, other, method):
- if not isinstance(other, self.__class__):
- other = self.__class__(other)
- method(other)
-
- def difference(self, other):
- return self._apply(other, self.data.difference)
- __sub__ = difference
-
- def difference_update(self, other):
- self._apply_mutate(self, self.data.difference_update)
- __isub__ = difference_update
-
- def intersection(self, other):
- return self._apply(other, self.data.intersection)
- __and__ = intersection
-
- def intersection_update(self, other):
- self._apply_mutate(self, self.data.intersection_update)
- __iand__ = intersection_update
-
- def issubset(self, other):
- return self.data.issubset(ref(item) for item in other)
- __lt__ = issubset
-
- def issuperset(self, other):
- return self.data.issuperset(ref(item) for item in other)
- __gt__ = issuperset
-
- def symmetric_difference(self, other):
- return self._apply(other, self.data.symmetric_difference)
- __xor__ = symmetric_difference
-
- def symmetric_difference_update(self, other):
- self._apply_mutate(other, self.data.symmetric_difference_update)
- __ixor__ = symmetric_difference_update
-
- def union(self, other):
- self._apply_mutate(other, self.data.union)
- __or__ = union