mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
SF bug #663701: sets module review
Renamed hook methods to use the double underscore convention.
This commit is contained in:
parent
e544f6f682
commit
2835e37be5
2 changed files with 11 additions and 11 deletions
|
@ -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
|
||||
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
|
||||
construct sets of sets.
|
||||
|
||||
A similar mechanism is needed by the \method{__contains__()} and
|
||||
\method{remove()} methods which need to hash an element to check
|
||||
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
|
||||
methods for \method{__hash__()}, \method{__eq__()}, and \method{__ne__()}.
|
||||
|
||||
The alternate mechanism spares the need to build a separate copy of
|
||||
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
|
||||
\class{_TemporarilyImmutableSet}.
|
||||
|
||||
|
|
14
Lib/sets.py
14
Lib/sets.py
|
@ -248,7 +248,7 @@ class BaseSet(object):
|
|||
try:
|
||||
return element in self._data
|
||||
except TypeError:
|
||||
transform = getattr(element, "_as_temporarily_immutable", None)
|
||||
transform = getattr(element, "__as_temporarily_immutable__", None)
|
||||
if transform is None:
|
||||
raise # re-raise the TypeError exception we caught
|
||||
return transform() in self._data
|
||||
|
@ -325,7 +325,7 @@ class BaseSet(object):
|
|||
data[element] = value
|
||||
return
|
||||
except TypeError:
|
||||
transform = getattr(element, "_as_immutable", None)
|
||||
transform = getattr(element, "__as_immutable__", None)
|
||||
if transform is None:
|
||||
raise # re-raise the TypeError exception we caught
|
||||
data[transform()] = value
|
||||
|
@ -335,7 +335,7 @@ class BaseSet(object):
|
|||
try:
|
||||
data[element] = value
|
||||
except TypeError:
|
||||
transform = getattr(element, "_as_immutable", None)
|
||||
transform = getattr(element, "__as_immutable__", None)
|
||||
if transform is None:
|
||||
raise # re-raise the TypeError exception we caught
|
||||
data[transform()] = value
|
||||
|
@ -464,7 +464,7 @@ class Set(BaseSet):
|
|||
try:
|
||||
self._data[element] = True
|
||||
except TypeError:
|
||||
transform = getattr(element, "_as_immutable", None)
|
||||
transform = getattr(element, "__as_immutable__", None)
|
||||
if transform is None:
|
||||
raise # re-raise the TypeError exception we caught
|
||||
self._data[transform()] = True
|
||||
|
@ -477,7 +477,7 @@ class Set(BaseSet):
|
|||
try:
|
||||
del self._data[element]
|
||||
except TypeError:
|
||||
transform = getattr(element, "_as_temporarily_immutable", None)
|
||||
transform = getattr(element, "__as_temporarily_immutable__", None)
|
||||
if transform is None:
|
||||
raise # re-raise the TypeError exception we caught
|
||||
del self._data[transform()]
|
||||
|
@ -496,11 +496,11 @@ class Set(BaseSet):
|
|||
"""Remove and return an arbitrary set element."""
|
||||
return self._data.popitem()[0]
|
||||
|
||||
def _as_immutable(self):
|
||||
def __as_immutable__(self):
|
||||
# Return a copy of self as an immutable set
|
||||
return ImmutableSet(self)
|
||||
|
||||
def _as_temporarily_immutable(self):
|
||||
def __as_temporarily_immutable__(self):
|
||||
# Return self wrapped in a temporarily immutable set
|
||||
return _TemporarilyImmutableSet(self)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue