]> granicus.if.org Git - python/commitdiff
Fix SF bug #763023, difflib.py: ratio() zero division not caught
authorNeal Norwitz <nnorwitz@gmail.com>
Tue, 1 Jul 2003 14:59:46 +0000 (14:59 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Tue, 1 Jul 2003 14:59:46 +0000 (14:59 +0000)
Backport candidate

Lib/difflib.py
Lib/test/test_difflib.py
Misc/NEWS

index 198114d987aac453f25ace1006cf71dc31396b96..eb0eccfd38a64d812e93f511c02cdf8f219d9711 100644 (file)
@@ -29,6 +29,11 @@ __all__ = ['get_close_matches', 'ndiff', 'restore', 'SequenceMatcher',
            '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 @@ class SequenceMatcher:
 
         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 @@ class SequenceMatcher:
             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 @@ class SequenceMatcher:
         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.
index 5687e32770d1049143e42c96c1eec5b403e0478e..e33539a460524184e96f7122edf37cf3596f2387 100644 (file)
@@ -1,3 +1,15 @@
 import difflib
 from test import test_support
+import unittest
+
+class TestSFbugs(unittest.TestCase):
+
+    def test_ratio_for_null_seqn(self):
+        # Check clearing of SF bug 763023
+        s = difflib.SequenceMatcher(None, [], [])
+        self.assertEqual(s.ratio(), 1)
+        self.assertEqual(s.quick_ratio(), 1)
+        self.assertEqual(s.real_quick_ratio(), 1)
+
+test_support.run_unittest(TestSFbugs)
 test_support.run_doctest(difflib)
index 76ec6739b72f7ae0788caed907f5e328c3e4b72c..d3761f946b5c0654803c78ae1d634cd9c63285a6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,9 @@ Extension modules
 Library
 -------
 
+- SF bug 763023: fix uncaught ZeroDivisionError in difflib ratio methods
+  when there are no lines.
+
 Tools/Demos
 -----------