summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2008-02-09 03:25:08 (GMT)
committerRaymond Hettinger <python@rcn.com>2008-02-09 03:25:08 (GMT)
commit7aebb64bab2ef75c6d9ae55da9ae7049f05c8670 (patch)
treee91905e2145e8adcf2deb82ab4abf6c17722e94d
parent74b6495b344303a84bf5e51ff388d8200dad4f64 (diff)
downloadcpython-7aebb64bab2ef75c6d9ae55da9ae7049f05c8670.zip
cpython-7aebb64bab2ef75c6d9ae55da9ae7049f05c8670.tar.gz
cpython-7aebb64bab2ef75c6d9ae55da9ae7049f05c8670.tar.bz2
Document how to use Set and MutableSet as a mixin.
-rw-r--r--Doc/library/collections.rst19
-rw-r--r--Lib/_abcoll.py4
2 files changed, 20 insertions, 3 deletions
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
index 8278ce4..1e32f99 100644
--- a/Doc/library/collections.rst
+++ b/Doc/library/collections.rst
@@ -58,7 +58,7 @@ ABC Inherits Abstract Methods Mixin M
``insert``, ``remove``, and ``__iadd__``
and ``__len__``
-:class:`Set` :class:`Sized`, ``__len__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
+:class:`Set` \(1) \(2) :class:`Sized`, ``__len__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
:class:`Iterable`, ``__iter__``, and ``__gt__``, ``__ge__``, ``__and__``, ``__or__``
:class:`Container` ``__contains__`` ``__sub__``, ``__xor__``, and ``isdisjoint``
@@ -100,6 +100,23 @@ The ABC supplies the remaining methods such as :meth:`__and__` and
s2 = ListBasedSet('defghi')
overlap = s1 & s2 # The __and__() method is supported automatically
+Notes on using :class:`Set` and :class:`MutableSet` as a mixin:
+
+(1)
+ Since some set operations create new sets, the default mixin methods need
+ a way to create new instances from an iterable. The class constructor is
+ assumed to have a signature in the form ``ClassName(iterable)``.
+ That assumption is factored-out to a singleinternal classmethod called
+ :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set.
+ If the :class:`Set` mixin is being used in a class with a different
+ constructor signature, you will need to override :meth:`from_iterable`
+ with a classmethod that can construct new instances from
+ an iterable argument.
+
+(2)
+ To override the comparisons (presumably for speed, as the
+ semantics are fixed), redefine :meth:`__le__` and
+ then the other operations will automatically follow suit.
(For more about ABCs, see the :mod:`abc` module and :pep:`3119`.)
diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py
index 113507a..c241a95 100644
--- a/Lib/_abcoll.py
+++ b/Lib/_abcoll.py
@@ -207,9 +207,9 @@ class Set(Sized, Iterable, Container):
'''Construct an instance of the class from any iterable input.
Must override this method if the class constructor signature
- will not accept a frozenset for an input.
+ does not accept an iterable for an input.
'''
- return cls(frozenset(it))
+ return cls(it)
def __and__(self, other):
if not isinstance(other, Iterable):