4

以下示例代码:

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. 此错误(或类似错误)是否由未终止的文档字符串以外的任何内容引起?
4

1 回答 1

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 = "'"
于 2009-10-28T22:42:21.167 回答