diff options
author | Tim Peters <tim.peters@gmail.com> | 2002-08-25 18:43:10 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2002-08-25 18:43:10 (GMT) |
commit | ea76c98014e7f99974e3dcdbe168d45762bf627d (patch) | |
tree | f2729aa74a20f828711173c423fe1e44bdb70e62 | |
parent | 93d8d48c15981ffbf9314d4f2aeeff008c227eb9 (diff) | |
download | cpython-ea76c98014e7f99974e3dcdbe168d45762bf627d.zip cpython-ea76c98014e7f99974e3dcdbe168d45762bf627d.tar.gz cpython-ea76c98014e7f99974e3dcdbe168d45762bf627d.tar.bz2 |
Implemented <, <=, >, >= for sets, giving subset and proper-subset
meanings. I did not add new, e.g., ispropersubset() methods; we're
going nuts on those, and, e.g., there was no "friendly name" for
== either.
-rw-r--r-- | Doc/lib/libsets.tex | 17 | ||||
-rw-r--r-- | Lib/sets.py | 12 | ||||
-rw-r--r-- | Lib/test/test_sets.py | 28 |
3 files changed, 45 insertions, 12 deletions
diff --git a/Doc/lib/libsets.tex b/Doc/lib/libsets.tex index 8ce62c889..c5239a4 100644 --- a/Doc/lib/libsets.tex +++ b/Doc/lib/libsets.tex @@ -74,9 +74,11 @@ the following operations: \lineii{\var{x} not in \var{s}} {test \var{x} for non-membership in \var{s}} \lineii{\var{s}.issubset(\var{t})} - {test whether every element in \var{s} is in \var{t}} + {test whether every element in \var{s} is in \var{t}; + \code{\var{s} <= \var{t}} is equivalent} \lineii{\var{s}.issuperset(\var{t})} - {test whether every element in \var{t} is in \var{s}} + {test whether every element in \var{t} is in \var{s}; + \code{\var{s} >= \var{t}} is equivalent} \hline \lineii{\var{s} | \var{t}} @@ -99,9 +101,14 @@ the following operations: {new set with a shallow copy of \var{s}} \end{tableii} -In addition to the above operations, both \class{Set} and \class{ImmutableSet} -support set to set equality comparisons. Two sets are equal if and only if -every element of each set is contained in the other. +In addition, both \class{Set} and \class{ImmutableSet} +support set to set comparisons. Two sets are equal if and only if +every element of each set is contained in the other (each is a subset +of the other). +A set is less than another set if and only if the first set is a proper +subset of the second set (is a subset, but is not equal). +A set is greater than another set if and only if the first set is a proper +superset of the second set (is a superset, but is not equal). The following table lists operations available in \class{ImmutableSet} but not found in \class{Set}: diff --git a/Lib/sets.py b/Lib/sets.py index ff0ace0..3897fb9 100644 --- a/Lib/sets.py +++ b/Lib/sets.py @@ -275,6 +275,18 @@ class BaseSet(object): 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): diff --git a/Lib/test/test_sets.py b/Lib/test/test_sets.py index 15c52c8..840036c 100644 --- a/Lib/test/test_sets.py +++ b/Lib/test/test_sets.py @@ -364,23 +364,37 @@ class TestSubsets(unittest.TestCase): case2method = {"<=": "issubset", ">=": "issuperset", } - cases_with_ops = Set(["==", "!="]) + + reverse = {"==": "==", + "!=": "!=", + "<": ">", + ">": "<", + "<=": ">=", + ">=": "<=", + } def test_issubset(self): x = self.left y = self.right for case in "!=", "==", "<", "<=", ">", ">=": expected = case in self.cases + # Test the binary infix spelling. + result = eval("x" + case + "y", locals()) + self.assertEqual(result, expected) + # Test the "friendly" method-name spelling, if one exists. if case in TestSubsets.case2method: - # Test the method-name spelling. method = getattr(x, TestSubsets.case2method[case]) result = method(y) self.assertEqual(result, expected) - if case in TestSubsets.cases_with_ops: - # Test the binary infix spelling. - result = eval("x" + case + "y", locals()) - self.assertEqual(result, expected) + # Now do the same for the operands reversed. + rcase = TestSubsets.reverse[case] + result = eval("y" + rcase + "x", locals()) + self.assertEqual(result, expected) + if rcase in TestSubsets.case2method: + method = getattr(y, TestSubsets.case2method[rcase]) + result = method(x) + self.assertEqual(result, expected) #------------------------------------------------------------------------------ class TestSubsetEqualEmpty(TestSubsets): @@ -410,7 +424,7 @@ class TestSubsetEmptyNonEmpty(TestSubsets): class TestSubsetPartial(TestSubsets): left = Set([1]) right = Set([1, 2]) - name = "one a non-empty subset of other" + name = "one a non-empty proper subset of other" cases = "!=", "<", "<=" #------------------------------------------------------------------------------ |