difflib problem

02/11/2012 - 14:51 von Berthold Hoellmann | Report spam
Moin,

Ich versuche eine spezielles diff zu schreiben und wollte dazu die
python difflib nutzen. Allerdings macht sie (natürlich?) nicht das, was
ich von ihr erwarte;

Python 2.7.3 (default, Jul 24 2012, 15:00:49)
[GCC 3.3.3 (SuSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.



import difflib
class line(object):






... def __init__(self, val):
... self.val = val
... def __eq__(self, other):
... print '__eq__', self.val, other.val
... return abs(self.val - other.val) < 1.
...



f1 = [line(i) for i in [1., 2., 3., 4.]]
f2 = [line(i) for i in [1.1, 3.1, 3.3, 4.4]]

match = difflib.SequenceMatcher(None, f1, f2)
for opcode in match.get_opcodes():






... print "%-7s a[%d:%d] b[%d:%d]" % opcode
...
__eq__ 1.0 1.1
__eq__ 2.0 3.1
__eq__ 2.0 3.1
equal a[0:1] b[0:1]
replace a[1:4] b[1:4]












ich hàtte deutlich mehr Aufrufe von '__eq__' erwartet und dass Ergebnis:

equal a[0:1] b[0:1]
replace a[1:2] b[1:2]
equal a[2:4] b[2:4]

Warum gibts das nicht?

Danke
Berthold
__ Address:
G / \ L Germanischer Lloyd SE
phone: +49-40-36149-7374 -+-+- Brooktorkai 18
fax : +49-40-36149-7320 \__/ D-20457 Hamburg
 

Lesen sie die antworten

#1 bhoel
02/11/2012 - 21:25 | Warnen spam

Berthold Hoellmann writes:

Moin,

Ich versuche eine spezielles diff zu schreiben und wollte dazu die
python difflib nutzen. Allerdings macht sie (natà¼rlich?) nicht das, was
ich von ihr erwarte;

Python 2.7.3 (default, Jul 24 2012, 15:00:49)
[GCC 3.3.3 (SuSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import difflib
class line(object):






... def __init__(self, val):
... self.val = val
... def __eq__(self, other):
... print '__eq__', self.val, other.val
... return abs(self.val - other.val) < 1.
...
f1 = [line(i) for i in [1., 2., 3., 4.]]
f2 = [line(i) for i in [1.1, 3.1, 3.3, 4.4]]

match = difflib.SequenceMatcher(None, f1, f2)
for opcode in match.get_opcodes():






... print "%-7s a[%d:%d] b[%d:%d]" % opcode
...
__eq__ 1.0 1.1
__eq__ 2.0 3.1
__eq__ 2.0 3.1
equal a[0:1] b[0:1]
replace a[1:4] b[1:4]









ich hà¤tte deutlich mehr Aufrufe von '__eq__' erwartet und dass Ergebnis:

equal a[0:1] b[0:1]
replace a[1:2] b[1:2]
equal a[2:4] b[2:4]

Warum gibts das nicht?

Danke
Berthold



Ich habe dann doch noch eine Lösung gefunden. Wenn ich __hash__ auf eine
ganz böse, verbotene Art und Weise definiere, dann funktionert es wie
ich es mir vorstelle:

In [1]: import difflib

In [2]: def GCount():
...: _val = 0
...: while True:
...: yield _val
...: _val += 1
...:

In [3]: class line(object):
...: def __init__(self, val):
...: self.val = val
...: self._cnt = GCount()
...: def __eq__(self, other):
...: return abs(self.val - other.val) < 1.
...: def __hash__(self):
...: return self._cnt.next()
...:

In [4]: def docmp(a, b):
...: match = difflib.SequenceMatcher(None, a, b)
...: for opcode in match.get_opcodes():
...: print "%-7s a[%d:%d] b[%d:%d]" % opcode
...:

In [5]: docmp([line(i) for i in [1., 2., 3., 4.]],
...: [line(i) for i in [1.1, 3.1, 3.3, 4.4]])
equal a[0:1] b[0:1]
replace a[1:2] b[1:2]
equal a[2:4] b[2:4]

In [6]: docmp([line(i) for i in [1., 2., 3., 4.]],
...: [line(i) for i in [1.1, 4, 3.1, 3.3, 4.4]])
equal a[0:1] b[0:1]
replace a[1:2] b[1:3]
equal a[2:4] b[3:5]

In [7]:



A: Weil es die Lesbarkeit des Textes verschlechtert.
F: Warum ist TOFU so schlimm?
A: TOFU
F: Was ist das gröàŸte à„rgernis im Usenet?


Ähnliche fragen