summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2014-06-21 11:27:36 -0700
committerRaymond Hettinger <python@rcn.com>2014-06-21 11:27:36 -0700
commit7f1f10032cfb20d2148ee58d22daab6e58f339a6 (patch)
tree1377e51c19e53bdc871b3ea6fceb51fc58bb7f62
parentcb8f65d54dd2209fb0e9df525400ac6479a4f24a (diff)
downloadcpython-7f1f10032cfb20d2148ee58d22daab6e58f339a6.tar.gz
Issue 21635: Fix caching in difflib.SequenceMatcher.get_matching_blocks().
-rw-r--r--Lib/difflib.py4
-rw-r--r--Lib/test/test_difflib.py9
-rw-r--r--Misc/NEWS4
3 files changed, 15 insertions, 2 deletions
diff --git a/Lib/difflib.py b/Lib/difflib.py
index 5dac1d63ae..3880d8472e 100644
--- a/Lib/difflib.py
+++ b/Lib/difflib.py
@@ -523,8 +523,8 @@ class SequenceMatcher:
non_adjacent.append((i1, j1, k1))
non_adjacent.append( (la, lb, 0) )
- self.matching_blocks = non_adjacent
- return map(Match._make, self.matching_blocks)
+ self.matching_blocks = map(Match._make, non_adjacent)
+ return self.matching_blocks
def get_opcodes(self):
"""Return list of 5-tuples describing how to turn a into b.
diff --git a/Lib/test/test_difflib.py b/Lib/test/test_difflib.py
index 310bf99782..35f2c36ca7 100644
--- a/Lib/test/test_difflib.py
+++ b/Lib/test/test_difflib.py
@@ -59,6 +59,15 @@ class TestSFbugs(unittest.TestCase):
diff_gen = difflib.unified_diff([], [])
self.assertRaises(StopIteration, diff_gen.next)
+ def test_matching_blocks_cache(self):
+ # Issue #21635
+ s = difflib.SequenceMatcher(None, "abxcd", "abcd")
+ first = s.get_matching_blocks()
+ second = s.get_matching_blocks()
+ self.assertEqual(second[0].size, 2)
+ self.assertEqual(second[1].size, 2)
+ self.assertEqual(second[2].size, 0)
+
def test_added_tab_hint(self):
# Check fix for bug #1488943
diff = list(difflib.Differ().compare(["\tI am a buggy"],["\t\tI am a bug"]))
diff --git a/Misc/NEWS b/Misc/NEWS
index 6cd1bd245a..664eba74af 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -31,6 +31,10 @@ Library
- Issue #21491: SocketServer: Fix a race condition in child processes reaping.
+- Issue #21635: The difflib SequenceMatcher.get_matching_blocks() method
+ cache didn't match the actual result. The former was a list of tuples
+ and the latter was a list of named tuples.
+
- Issue #21722: The distutils "upload" command now exits with a non-zero
return code when uploading fails. Patch by Martin Dengler.