diff Lib/difflib.py @ 29719:fa4cf878c538 legacy-trunk

Fix SF bug #763023, difflib.py: ratio() zero division not caught Backport candidate
author Neal Norwitz <nnorwitz@gmail.com>
date Tue, 01 Jul 2003 14:59:46 +0000
parents 94ac1d42a420
children 9ca291865f9c
line wrap: on
line diff
--- a/Lib/difflib.py	Tue Jul 01 14:49:32 2003 +0000
+++ b/Lib/difflib.py	Tue Jul 01 14:59:46 2003 +0000
@@ -29,6 +29,11 @@
            'Differ','IS_CHARACTER_JUNK', 'IS_LINE_JUNK', 'context_diff',
            'unified_diff']
 
+def _calculate_ratio(matches, length):
+    if length:
+        return 2.0 * matches / length
+    return 1.0
+
 class SequenceMatcher:
 
     """
@@ -611,7 +616,7 @@
 
         matches = reduce(lambda sum, triple: sum + triple[-1],
                          self.get_matching_blocks(), 0)
-        return 2.0 * matches / (len(self.a) + len(self.b))
+        return _calculate_ratio(matches, len(self.a) + len(self.b))
 
     def quick_ratio(self):
         """Return an upper bound on ratio() relatively quickly.
@@ -640,7 +645,7 @@
             avail[elt] = numb - 1
             if numb > 0:
                 matches = matches + 1
-        return 2.0 * matches / (len(self.a) + len(self.b))
+        return _calculate_ratio(matches, len(self.a) + len(self.b))
 
     def real_quick_ratio(self):
         """Return an upper bound on ratio() very quickly.
@@ -652,7 +657,7 @@
         la, lb = len(self.a), len(self.b)
         # can't have more matches than the number of elements in the
         # shorter sequence
-        return 2.0 * min(la, lb) / (la + lb)
+        return _calculate_ratio(min(la, lb), la + lb)
 
 def get_close_matches(word, possibilities, n=3, cutoff=0.6):
     """Use SequenceMatcher to return list of the best "good enough" matches.