From: Raymond Hettinger Date: Fri, 11 Jan 2008 03:20:54 +0000 (+0000) Subject: Improve usability of the SequenceMatcher by returning named tuples describing match... X-Git-Tag: v2.6a1~646 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0ff4dafee0025f5565cbd0ef151d385fc33d7936;p=python Improve usability of the SequenceMatcher by returning named tuples describing match ranges. --- diff --git a/Lib/difflib.py b/Lib/difflib.py index 9be6ca7242..f1c4444fa0 100644 --- a/Lib/difflib.py +++ b/Lib/difflib.py @@ -30,9 +30,12 @@ Class HtmlDiff: __all__ = ['get_close_matches', 'ndiff', 'restore', 'SequenceMatcher', 'Differ','IS_CHARACTER_JUNK', 'IS_LINE_JUNK', 'context_diff', - 'unified_diff', 'HtmlDiff'] + 'unified_diff', 'HtmlDiff', 'Match'] import heapq +from collections import namedtuple as _namedtuple + +Match = _namedtuple('Match', 'a b size') def _calculate_ratio(matches, length): if length: @@ -363,7 +366,7 @@ class SequenceMatcher: >>> s = SequenceMatcher(None, " abcd", "abcd abcd") >>> s.find_longest_match(0, 5, 0, 9) - (0, 4, 5) + Match(a=0, b=4, size=5) If isjunk is defined, first the longest matching block is determined as above, but with the additional restriction that no @@ -379,13 +382,13 @@ class SequenceMatcher: >>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd") >>> s.find_longest_match(0, 5, 0, 9) - (1, 0, 4) + Match(a=1, b=0, size=4) If no blocks match, return (alo, blo, 0). >>> s = SequenceMatcher(None, "ab", "c") >>> s.find_longest_match(0, 2, 0, 1) - (0, 0, 0) + Match(a=0, b=0, size=0) """ # CAUTION: stripping common prefix or suffix would be incorrect. @@ -452,7 +455,7 @@ class SequenceMatcher: a[besti+bestsize] == b[bestj+bestsize]: bestsize = bestsize + 1 - return besti, bestj, bestsize + return Match(besti, bestj, bestsize) def get_matching_blocks(self): """Return list of triples describing matching subsequences. @@ -470,7 +473,7 @@ class SequenceMatcher: >>> s = SequenceMatcher(None, "abxcd", "abcd") >>> s.get_matching_blocks() - [(0, 0, 2), (3, 2, 2), (5, 4, 0)] + [Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)] """ if self.matching_blocks is not None: @@ -523,7 +526,7 @@ class SequenceMatcher: non_adjacent.append( (la, lb, 0) ) self.matching_blocks = non_adjacent - return self.matching_blocks + return map(Match._make, self.matching_blocks) def get_opcodes(self): """Return list of 5-tuples describing how to turn a into b.