2011-01-19 3 views
1

왜 것이python 토큰 화의 버그?

if 1 \ 
and 0: 
    pass 

토큰 화/untokenize주기에 코드 초크의 간단한이

import tokenize 
import cStringIO 

def tok_untok(src): 
    f = cStringIO.StringIO(src) 
    return tokenize.untokenize(tokenize.generate_tokens(f.readline)) 

src='''if 1 \\ 
and 0: 
    pass 
''' 
print tok_untok(src) 

그것은 예외 :

AssertionError: 
File "/mnt/home/anushri/untitled-1.py", line 13, in <module> 
    print tok_untok(src) 
File "/mnt/home/anushri/untitled-1.py", line 6, in tok_untok 
    tokenize.untokenize(tokenize.generate_tokens(f.readline)) 
File "/usr/lib/python2.6/tokenize.py", line 262, in untokenize 
    return ut.untokenize(iterable) 
File "/usr/lib/python2.6/tokenize.py", line 198, in untokenize 
    self.add_whitespace(start) 
File "/usr/lib/python2.6/tokenize.py", line 187, in add_whitespace 
    assert row <= self.prev_row 

이 토큰 화되는 SRC를 수정하지 않고 해결 방법이 있나요 (그것은 \이 범인 인 것 같습니다)

실패한 또 다른 예는 끝에 줄 바꿈이없는 경우입니다. src='if 1:pass'이 같은 오류와 함께 실패

해결 방법 : 그러나 untokenize 다른 방법을

def tok_untok(src): 
    f = cStringIO.StringIO(src) 
    tokens = [ t[:2] for t in tokenize.generate_tokens(f.readline)] 
    return tokenize.untokenize(tokens) 

즉 다시 전체 토큰 튜플 만 t에 통과하지 못한 작품을 사용하는 것 [2]

python doc하지만 추가 말합니다를 args는 건너 뜁니다

토큰을 파이썬 소스 코드로 변환합니다. 이터 러블은 시퀀스를 적어도 두 개의 요소, 즉 토큰 유형과 토큰 문자열로 반환해야합니다. 추가 시퀀스 요소는 모두 입니다.

+0

파이썬 2.5에서는 괜찮습니다. 2.7에서는 AssertionError를 던집니다. – TryPyPy

답변

3

예, 해당 번호는 known bug이며이 문제에 첨부 된 것보다 더 깨끗한 패치에 관심이 있습니다. 더 나은 파이썬에 기여할 수있는 완벽한 시간;)

+0

해결 방법은 제 수정을 참조하십시오. –