2010-01-08 4 views
2

문서에 따르면, 당신은 certian 라인을 무시하는 linejunk 기능을 제공 할 수 있습니다. 그러나, 나는 그것을 작동시킬 수 없습니다. 다음은 토론을위한 몇 가지 예제 코드는 다음과 같습니다difflib.ndiff를 사용하여 줄을 어떻게 무시합니까?

from re import search 
from difflib import ndiff 
t1 = 'one 1\ntwo 2\nthree 3' 
t2 = 'one 1\ntwo 29\nthree 3' 
diff = ndiff(t1.splitlines(), t2.splitlines(), lambda x: search('2', x)) 

내 의도는 차이를 표시하지 않습니다 발전기 될 것입니다 두 번째 줄과 DIFF을 무시하는 것이다.

도움 주셔서 감사합니다.

답변

0

예제에 문제가 있습니다. ndiff의 처음 두 인수는 각각 문자열 목록이어야합니다. 당신은 문자들의리스트처럼 다루어지는 하나의 문자열을 가지고있다. the docs을 참조하십시오. 예 : t1 = 'one 1\ntwo 2\nthree 3'.splitlines()

그러나 다음 예제에서와 같이 difflib.ndiff는 모든 행에 대해 linejunk 함수를 호출하지 않습니다. 이것은 오랫동안 행해졌습니다 - Python 2.2에서 2.6까지 및 3.1에서 검증되었습니다.

스크립트 예 : 파이썬 2.6 실행에서

from difflib import ndiff 
t1 = 'one 1\ntwo 2\nthree 3'.splitlines() 
t2 = 'one 1\ntwo 29\nthree 3'.splitlines() 
def lj(line): 
    rval = '2' in line 
    print("lj: line=%r, rval=%s" % (line, rval)) 
    return rval 
d = list(ndiff(t1, t2 )); print("%d %r\n" % (1, d)) 
d = list(ndiff(t1, t2, lj)); print("%d %r\n" % (2, d)) 
d = list(ndiff(t2, t1, lj)); print("%d %r\n" % (3, d)) 

출력 : 당신은 버그로보고 할 수도 있습니다

1 [' one 1', '- two 2', '+ two 29', '?  +\n', ' three 3'] 

lj: line='one 1', rval=False 
lj: line='two 29', rval=True 
lj: line='three 3', rval=False 
2 [' one 1', '- two 2', '+ two 29', '?  +\n', ' three 3'] 

lj: line='one 1', rval=False 
lj: line='two 2', rval=True 
lj: line='three 3', rval=False 
3 [' one 1', '- two 29', '?  -\n', '+ two 2', ' three 3'] 

. 그러나 문서는 "정크"인 줄에 어떤 의미가 붙어 있는지 분명하게 말하지 않습니다. 기대했던 결과는 무엇입니까?

또한 의문 : 기본 linejunk 기능은 사용하지 않는 것과 동일 사용시 말하면 결과

4 [' one 1', '- ', '+ ', '+ #', '+ ', ' two 2'] 

5 [' one 1', '+ ', '- ', '- #', '- ', ' two 2'] 

6 [' one 1', '- ', '+ ', '+ #', '+ ', ' two 2'] 

7 [' one 1', '+ ', '- ', '- #', '- ', ' two 2'] 

: 스크립트에이 라인을 추가 :

t3 = 'one 1\n \ntwo 2\n'.splitlines() 
t4 = 'one 1\n\n#\n\ntwo 2\n'.splitlines() 
d = list(ndiff(t3, t4  )); print("%d %r\n" % (4, d)) 
d = list(ndiff(t4, t3  )); print("%d %r\n" % (5, d)) 
d = list(ndiff(t3, t4, None)); print("%d %r\n" % (6, d)) 
d = list(ndiff(t4, t3, None)); print("%d %r\n" % (7, d)) 

는이 출력을 생성 linejunk 함수는 다른 "쓰레기"행 (초기 해시를 제외한 공백)을 포함하는 경우에 사용됩니다.

아마 당신이 달성하려는 것을 우리에게 말할 수 있다면, 우리는 대안적인 접근 방법을 제안 할 수있을 것입니다. 추가 정보

편집 의도는 의미를 '2'를 포함하는 모든 라인을 무시 그들이 ndiff 목적을 위해 존재하지 않는 척하는 일반성에있는 경우, 당신이해야 할 핑계를 켭니다 현실로 :

+0

내 의도는 두 번째 줄을 무시하고 차이점을 표시하지 않는 생성기가됩니다. – behindalens

+0

나는 그것을 끝내었다. 원래 HtmlDiff 함수를 사용하고 있었고 html 출력을 만들 때 특정 줄을 무시하기를 원했습니다. 나는 문서가 두 사람이 관련되어 있음을 암시했기 때문에 ndiff로 인도되었다. linejunk 함수가 실제로이 시점에서 무엇을하는지 궁금합니다. – behindalens

+0

@behindalens : 나는 당신의 경이를 이야기합니다. 버그 보고서 및/또는 문서 설명 요청을 제출할 수 있습니다. 나는 소스 코드를 읽을 수도 있습니다 :-) ... 그동안 질문에 대한 답변이 있다고 생각합니까? –

3

나는 최근에 같은 문제를 만났습니다.

다음은 내가 알아 낸 것들입니다.

cf. http://bugs.python.org/issue14332

* 표시 정크 매개 변수의 주요 목적은 차이를 마스크하지, 차이를 찾을 수 에 일치하는 속도를하는 것입니다.

c.f. http://hg.python.org/cpython/rev/0a69b1e8b7fe/

패치는 difflib 문서

이 스팸 필터링 기능 차이 을 찾기 위해 일치하는 속도 및 다른 라인을 일으키지 않는

의 개념을 "무시"를 "쓰레기"과의 더 나은 설명을 제공합니다 또는 무시할 문자.

+0

이 질문에 대한 대답이어야합니다. – matthewatabet

관련 문제