如何处理Python 2.6中未结束的多行注释的令牌错误
以下是一个示例代码:
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))
关于这种行为的一些问题:
- 我应该在这里捕获并“选择性”忽略 tokenize.TokenError 吗?还是说我应该停止尝试从不合规或不完整的代码中生成标记?如果是这样,我该如何检查这些问题呢?
- 这个错误(或类似的错误)是否可能由其他原因引起,而不仅仅是因为文档字符串没有结束?
1 个回答
2
处理分词错误的方法完全取决于你为什么要进行分词。你的代码会给出所有有效的标记,直到出现错误的字符串部分。如果这个标记流对你有用,那就继续使用它。
你有几种选择来处理这个错误:
你可以选择忽略这个错误,这样就会得到一个不完整的标记流。
你可以先把所有的标记都存起来,只有在没有错误发生时才使用这个标记流。
你可以处理这些标记,但如果发生错误,就停止更高层次的处理。
至于这个错误是否只会出现在不完整的文档字符串中,答案是否定的。记住,文档字符串其实就是字符串字面量。任何没有结束的多行字符串字面量都会出现同样的错误。代码中其他的词法错误也可能会导致类似的错误。
例如,以下是一些会产生错误的字符串值(至少在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 = "'"