#64 ZeroDivisionError on diff

closed-invalid
nobody
None
5
2004-10-17
2004-10-07
No

Someone just changed a page on my wiki, and now a diff
crashes with a ZeroDivisionError.

Python Python 2.2.2: /usr/bin/python2
Linux rabbit 2.4.20-18.7 #1 Thu May 29 06:51:53 EDT
2003 i686
MoinMoin Release 1.2.3 [Revision 1.186]
Thu Oct 7 15:18:11 2004

A problem occurred in a Python script. Here is the
sequence of function calls leading up to the error, in
the order they occurred.

/usr/local/lib/python2.2/site-packages/MoinMoin/request.py
in run(self=<MoinMoin.request.RequestCGI instance>)
454 else:
455 try:
456
cgitb.Hook(file=self).handle(saved_exc)
457 # was: cgitb.handler()
458 except:
cgitb = <module 'MoinMoin.support.cgitb' from
'/usr/loca...hon2.2/site-packages/MoinMoin/support/cgitb.pyc'>,
cgitb.Hook = <class MoinMoin.support.cgitb.Hook>, file
undefined, self = <MoinMoin.request.RequestCGI
instance>, ).handle undefined, saved_exc = (<class
exceptions.ZeroDivisionError>,
<exceptions.ZeroDivisionError instance>, <traceback
object>)

/usr/local/lib/python2.2/site-packages/MoinMoin/wikiaction.py
in do_diff(pagename='OpenLetterOnPython',
request=<MoinMoin.request.RequestCGI instance>)
294 if request.user.show_fancy_diff:
295 from MoinMoin.util.diff import diff
296 request.write(diff(request,
oldpage.get_raw_body(), newpage.get_raw_body()))
297 newpage.send_page(request, count_hit=0,
content_only=1, content_id="content-under-diff")
298 else:
request = <MoinMoin.request.RequestCGI instance>,
request.write = <bound method RequestCGI.write of
<MoinMoin.request.RequestCGI instance>>, diff =
<function diff>, oldpage = <MoinMoin.Page.Page
instance>, oldpage.get_raw_body = <bound method
Page.get_raw_body of <MoinMoin.Page.Page instance>>,
newpage = <MoinMoin.Page.Page instance>,
newpage.get_raw_body = <bound method Page.get_raw_body
of <MoinMoin.Page.Page instance>>

/usr/local/lib/python2.2/site-packages/MoinMoin/util/diff.py
in diff(request=<MoinMoin.request.RequestCGI instance>,
old="= An Open Letter on Python =\n\n== What Is This?
=...s/cat_python.html#003382 Toward Python's
future]\n", new="= An Open Letter on Python =\n\n==
What Is This? =...s/cat_python.html#003382 Toward
Python's future]\n")
94 charmatch = charobj.get_matching_blocks()
95
96 if charobj.ratio() < 0.5:
97 # Insufficient similarity.
98 if leftpane:
charobj = <difflib.SequenceMatcher instance>,
charobj.ratio = <bound method SequenceMatcher.ratio of
<difflib.SequenceMatcher instance>>

//usr/lib/python2.2/difflib.py in
ratio(self=<difflib.SequenceMatcher instance>)
526 matches = reduce(lambda sum, triple: sum
+ triple[-1],
527
self.get_matching_blocks(), 0)
528 return 2.0 * matches / (len(self.a) +
len(self.b))
529
530 def quick_ratio(self):
matches = 0, len undefined, self =
<difflib.SequenceMatcher instance>, self.a = '', self.b
= ''

ZeroDivisionError: float division
__doc__ = 'Second argument to a division or
modulo operation was zero.'
__getitem__ = <bound method
ZeroDivisionError.__getitem__ of
<exceptions.ZeroDivisionError instance>>
__init__ = <bound method
ZeroDivisionError.__init__ of
<exceptions.ZeroDivisionError instance>>
__module__ = 'exceptions'
__str__ = <bound method ZeroDivisionError.__str__
of <exceptions.ZeroDivisionError instance>>
args = ('float division',)

Discussion

  • Logged In: YES
    user_id=470843

    528 return 2.0 * matches / (len(self.a) + len(self.b))

    Looks like self.a and self.b are zero length.

     
    • status: open --> closed-invalid
     
  • Logged In: YES
    user_id=100649

    IIRC, this can be easily fixed by using difflib of python 2.2.3.

    Or even better, by upgrading to python 2.3.