代码之家  ›  专栏  ›  技术社区  ›  ChristopheD

如何处理带有未终止多行注释的标记化错误(python 2.6)

  •  4
  • ChristopheD  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  2
  •   Ned Batchelder    16 年前

    如何处理标记化错误完全取决于标记化的原因。代码将提供所有有效标记,直到错误字符串文字的开头。如果该令牌流对您有用,那么使用它。

    关于如何处理错误,您有几个选项:

    1. 您可以忽略它并拥有一个不完整的令牌流。

    2. 您可以缓冲所有令牌,并且只有在没有发生错误时才使用令牌流。

    3. 您可以处理令牌,但如果发生错误,将中止更高级别的处理。

    至于除了不完整的docstring之外,该错误是否会发生,是的。请记住,docstring只是字符串文本。任何未终止的多行字符串文字都将给出相同的错误。代码中的其他词法错误也可能发生类似的错误。

    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 = "'"