終了していない複数行コメントでトークン化エラーを処理する方法(Python 2.6)

StackOverflow https://stackoverflow.com/questions/1640097

質問

次のサンプルコード:

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. このエラー(または同様のエラー)は、 終了していないdocstring?
役に立ちましたか?

解決

トークン化エラーの処理方法は、トークン化の理由に完全に依存します。コードは、不正な文字列リテラルの先頭まで有効なトークンをすべて提供します。そのトークンストリームが役立つ場合は、それを使用します。

エラーの処理方法についていくつかのオプションがあります:

  1. これを無視して、トークンストリームが不完全になる可能性があります。

  2. すべてのトークンをバッファリングし、エラーが発生していない場合にのみトークンストリームを使用できます。

  3. トークンを処理できますが、エラーが発生した場合、上位レベルの処理を中止します。

そのエラーが不完全なdocstring以外で発生する可能性があるかどうかについては、はい。 docstringは単なる文字列リテラルであることに注意してください。終了していない複数行の文字列リテラルを使用すると、同じエラーが発生します。コード内の他の字句エラーでも同様のエラーが発生する可能性があります。

たとえば、エラーを生成する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 = "<*>quot;
s = "'"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top