如何处理Python 2.6中未结束的多行注释的令牌错误

4 投票
1 回答
3251 浏览
提问于 2025-04-15 15:28

以下是一个示例代码:

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

处理分词错误的方法完全取决于你为什么要进行分词。你的代码会给出所有有效的标记,直到出现错误的字符串部分。如果这个标记流对你有用,那就继续使用它。

你有几种选择来处理这个错误:

  1. 你可以选择忽略这个错误,这样就会得到一个不完整的标记流。

  2. 你可以先把所有的标记都存起来,只有在没有错误发生时才使用这个标记流。

  3. 你可以处理这些标记,但如果发生错误,就停止更高层次的处理。

至于这个错误是否只会出现在不完整的文档字符串中,答案是否定的。记住,文档字符串其实就是字符串字面量。任何没有结束的多行字符串字面量都会出现同样的错误。代码中其他的词法错误也可能会导致类似的错误。

例如,以下是一些会产生错误的字符串值(至少在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 = "'"

撰写回答