Как обработать ошибку токенизации с неопределенными многострочными комментариями (python 2.6) - PullRequest
4 голосов
/ 29 октября 2009

Следующий пример кода:

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 голосов
/ 29 октября 2009

Способ обработки ошибок токенизации полностью зависит от того, почему вы токенизируете. Ваш код дает вам все действительные токены вплоть до начала неверного строкового литерала. Если вам нужен этот токен, используйте его.

У вас есть несколько вариантов того, что делать с ошибкой:

  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 = "'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...