Commit bbf523bb authored by Raymond Hettinger's avatar Raymond Hettinger

SF bug #663701: sets module review

Renamed hook methods to use the double underscore convention.
parent 7925ec46
...@@ -203,23 +203,23 @@ before being added as a set element. ...@@ -203,23 +203,23 @@ before being added as a set element.
The mechanism is to always add a hashable element, or if it is not The mechanism is to always add a hashable element, or if it is not
hashable, the element is checked to see if it has an hashable, the element is checked to see if it has an
\method{_as_immutable()} method which returns an immutable equivalent. \method{__as_immutable__()} method which returns an immutable equivalent.
Since \class{Set} objects have a \method{_as_immutable()} method Since \class{Set} objects have a \method{__as_immutable__()} method
returning an instance of \class{ImmutableSet}, it is possible to returning an instance of \class{ImmutableSet}, it is possible to
construct sets of sets. construct sets of sets.
A similar mechanism is needed by the \method{__contains__()} and A similar mechanism is needed by the \method{__contains__()} and
\method{remove()} methods which need to hash an element to check \method{remove()} methods which need to hash an element to check
for membership in a set. Those methods check an element for hashability for membership in a set. Those methods check an element for hashability
and, if not, check for a \method{_as_temporarily_immutable()} method and, if not, check for a \method{__as_temporarily_immutable__()} method
which returns the element wrapped by a class that provides temporary which returns the element wrapped by a class that provides temporary
methods for \method{__hash__()}, \method{__eq__()}, and \method{__ne__()}. methods for \method{__hash__()}, \method{__eq__()}, and \method{__ne__()}.
The alternate mechanism spares the need to build a separate copy of The alternate mechanism spares the need to build a separate copy of
the original mutable object. the original mutable object.
\class{Set} objects implement the \method{_as_temporarily_immutable()} \class{Set} objects implement the \method{__as_temporarily_immutable__()}
method which returns the \class{Set} object wrapped by a new class method which returns the \class{Set} object wrapped by a new class
\class{_TemporarilyImmutableSet}. \class{_TemporarilyImmutableSet}.
......
...@@ -248,7 +248,7 @@ class BaseSet(object): ...@@ -248,7 +248,7 @@ class BaseSet(object):
try: try:
return element in self._data return element in self._data
except TypeError: except TypeError:
transform = getattr(element, "_as_temporarily_immutable", None) transform = getattr(element, "__as_temporarily_immutable__", None)
if transform is None: if transform is None:
raise # re-raise the TypeError exception we caught raise # re-raise the TypeError exception we caught
return transform() in self._data return transform() in self._data
...@@ -325,7 +325,7 @@ class BaseSet(object): ...@@ -325,7 +325,7 @@ class BaseSet(object):
data[element] = value data[element] = value
return return
except TypeError: except TypeError:
transform = getattr(element, "_as_immutable", None) transform = getattr(element, "__as_immutable__", None)
if transform is None: if transform is None:
raise # re-raise the TypeError exception we caught raise # re-raise the TypeError exception we caught
data[transform()] = value data[transform()] = value
...@@ -335,7 +335,7 @@ class BaseSet(object): ...@@ -335,7 +335,7 @@ class BaseSet(object):
try: try:
data[element] = value data[element] = value
except TypeError: except TypeError:
transform = getattr(element, "_as_immutable", None) transform = getattr(element, "__as_immutable__", None)
if transform is None: if transform is None:
raise # re-raise the TypeError exception we caught raise # re-raise the TypeError exception we caught
data[transform()] = value data[transform()] = value
...@@ -464,7 +464,7 @@ class Set(BaseSet): ...@@ -464,7 +464,7 @@ class Set(BaseSet):
try: try:
self._data[element] = True self._data[element] = True
except TypeError: except TypeError:
transform = getattr(element, "_as_immutable", None) transform = getattr(element, "__as_immutable__", None)
if transform is None: if transform is None:
raise # re-raise the TypeError exception we caught raise # re-raise the TypeError exception we caught
self._data[transform()] = True self._data[transform()] = True
...@@ -477,7 +477,7 @@ class Set(BaseSet): ...@@ -477,7 +477,7 @@ class Set(BaseSet):
try: try:
del self._data[element] del self._data[element]
except TypeError: except TypeError:
transform = getattr(element, "_as_temporarily_immutable", None) transform = getattr(element, "__as_temporarily_immutable__", None)
if transform is None: if transform is None:
raise # re-raise the TypeError exception we caught raise # re-raise the TypeError exception we caught
del self._data[transform()] del self._data[transform()]
...@@ -496,11 +496,11 @@ class Set(BaseSet): ...@@ -496,11 +496,11 @@ class Set(BaseSet):
"""Remove and return an arbitrary set element.""" """Remove and return an arbitrary set element."""
return self._data.popitem()[0] return self._data.popitem()[0]
def _as_immutable(self): def __as_immutable__(self):
# Return a copy of self as an immutable set # Return a copy of self as an immutable set
return ImmutableSet(self) return ImmutableSet(self)
def _as_temporarily_immutable(self): def __as_temporarily_immutable__(self):
# Return self wrapped in a temporarily immutable set # Return self wrapped in a temporarily immutable set
return _TemporarilyImmutableSet(self) return _TemporarilyImmutableSet(self)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment