문제

다음 샘플 코드:

import token, tokenize, StringIO

def generate_tokens(src):
    rawstr = StringIO.StringIO(unicode(src))
    tokens = tokenize.generate_tokens(rawstr.readline)
    for i, item in enumerate(tokens):
        toktype, toktext, (srow,scol), (erow,ecol), line = item
        print i, token.tok_name[toktype], toktext

s = \
"""
 def test(x):
     \"\"\" test with an unterminated docstring
"""

generate_tokens(s)

다음이 실행됩니다.

... (stripped a little)
File "/usr/lib/python2.6/tokenize.py", line 296, in generate_tokens
    raise TokenError, ("EOF in multi-line string", strstart)
tokenize.TokenError: ('EOF in multi-line string', (3, 5))

이 행동에 대한 몇 가지 질문:

  1. 여기에서 tokenize.TokenError를 포착하고 '선택적으로' 무시해야 합니까?아니면 비준수/불완전한 코드에서 토큰을 생성하려고하지 않아야합니까?그렇다면 어떻게 확인할 수 있나요?
  2. 이 오류 (또는 이와 유사한 오류)가 종료되지 않은 문서화 이외의 다른 것에 의해 야기 될 수 있습니까?
도움이 되었습니까?

해결책

토큰화 오류를 처리하는 방법은 전적으로 토큰화하는 이유에 따라 다릅니다.코드는 잘못된 문자열 리터럴이 시작될 때까지 모든 유효한 토큰을 제공합니다.해당 토큰 스트림이 유용하다면 사용하세요.

오류 처리 방법에 대한 몇 가지 옵션이 있습니다.

  1. 이를 무시하면 불완전한 토큰 스트림이 발생할 수 있습니다.

  2. 모든 토큰을 버퍼링하고 오류가 발생하지 않은 경우에만 토큰 스트림을 사용할 수 있습니다.

  3. 토큰을 처리할 수 있지만 오류가 발생하면 상위 수준 처리를 중단합니다.

불완전한 독스트링이 아닌 다른 오류로 인해 해당 오류가 발생할 수 있는지 여부는 그렇습니다.독스트링은 단지 문자열 리터럴이라는 점을 기억하세요.종료되지 않은 여러 줄 문자열 리터럴은 동일한 오류를 발생시킵니다.코드의 다른 어휘 오류에 대해서도 유사한 오류가 발생할 수 있습니다.

예를 들어, 다음은 오류를 생성하는 다른 s 값입니다(적어도 Python 2.5에서는).

s = ")"  # EOF in multi-line statement
s = "("  # EOF in multi-line statement
s = "]"  # EOF in multi-line statement
s = "["  # EOF in multi-line statement
s = "}"  # EOF in multi-line statement
s = "{"  # EOF in multi-line statement

이상하게도 다른 무의미한 입력은 대신 ERRORTOKEN 값을 생성합니다.

s = "$"
s = "'"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top