Index: Lib/test/test_difflib.py =================================================================== --- Lib/test/test_difflib.py (revision 87007) +++ Lib/test/test_difflib.py (working copy) @@ -12,12 +12,14 @@ self.assertEqual(list(sm.get_opcodes()), [ ('insert', 0, 0, 0, 1), ('equal', 0, 100, 1, 101)]) + self.assertEqual(sm.bpopular, set()) sm = difflib.SequenceMatcher(None, 'b' * 100, 'b' * 50 + 'a' + 'b' * 50) self.assertAlmostEqual(sm.ratio(), 0.995, places=3) self.assertEqual(list(sm.get_opcodes()), [ ('equal', 0, 50, 0, 50), ('insert', 50, 50, 50, 51), ('equal', 50, 100, 51, 101)]) + self.assertEqual(sm.bpopular, set()) def test_one_delete(self): sm = difflib.SequenceMatcher(None, 'a' * 40 + 'c' + 'b' * 40, 'a' * 40 + 'b' * 40) @@ -27,7 +29,20 @@ ('delete', 40, 41, 40, 40), ('equal', 41, 81, 40, 80)]) + def test_bjunk(self): + sm = difflib.SequenceMatcher(isjunk=lambda x: x == ' ', + a='a' * 40 + 'b' * 40, b='a' * 44 + 'b' * 40) + self.assertEqual(sm.bjunk, set()) + sm = difflib.SequenceMatcher(isjunk=lambda x: x == ' ', + a='a' * 40 + 'b' * 40, b='a' * 44 + 'b' * 40 + ' ' * 20) + self.assertEqual(sm.bjunk, {' '}) + + sm = difflib.SequenceMatcher(isjunk=lambda x: x in [' ', 'b'], + a='a' * 40 + 'b' * 40, b='a' * 44 + 'b' * 40 + ' ' * 20) + self.assertEqual(sm.bjunk, {' ', 'b'}) + + class TestAutojunk(unittest.TestCase): """Tests for the autojunk parameter added in 2.7""" def test_one_insert_homogenous_sequence(self): @@ -38,10 +53,12 @@ sm = difflib.SequenceMatcher(None, seq1, seq2) self.assertAlmostEqual(sm.ratio(), 0, places=3) + self.assertEqual(sm.bpopular, {'b'}) # Now turn the heuristic off sm = difflib.SequenceMatcher(None, seq1, seq2, autojunk=False) self.assertAlmostEqual(sm.ratio(), 0.9975, places=3) + self.assertEqual(sm.bpopular, set()) class TestSFbugs(unittest.TestCase): Index: Doc/library/difflib.rst =================================================================== --- Doc/library/difflib.rst (revision 87007) +++ Doc/library/difflib.rst (working copy) @@ -359,11 +359,11 @@ The *autojunk* parameter. SequenceMatcher objects get three data attributes: *bjunk* is the - set of elements of b for which *isjunk* is True; *bpopular* is the set of non- - junk elements considered popular by the heuristic (if it is not disabled); - *b2j* is a dict mapping the remaining elements of b to a list of positions where - they occur. All three are reset whenever *b* is reset with :meth:`set_seqs` - or :meth:`set_seq2`. + set of elements of *b* for which *isjunk* is True; *bpopular* is the set of + non-junk elements considered popular by the heuristic (if it is not + disabled); *b2j* is a dict mapping the remaining elements of *b* to a list + of positions where they occur. All three are reset whenever *b* is reset + with :meth:`set_seqs` or :meth:`set_seq2`. .. versionadded:: 3.2 The *bjunk* and *bpopular* attributes.