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

2024-10-01 13:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

以下示例代码:

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)

引发以下情况:

^{pr2}$

关于这种行为的一些问题:

  1. 我应该抓住并“选择性地”忽略吗标记化.TokenError在这里?或者 我是否应该停止尝试从不符合/不完整的代码生成令牌?如果是的话,我该怎么检查呢?在
  2. 此错误(或类似错误)是否由 未终止的docstring?在

Tags: testsrctoken示例def错误itemgenerate
1条回答
网友
1楼 · 发布于 2024-10-01 13:32:14

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

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

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

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

  3. 您可以处理标记,但如果发生错误,则中止更高级别的处理。

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

例如,以下是产生错误的其他s值(至少在python2.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值:

^{pr2}$

相关问题 更多 >