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. このエラー (または同様のエラー) は、終了していない docstring 以外の原因で発生する可能性がありますか?
4

1 に答える 1

2

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

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

  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 = "$"
s = "'"
于 2009-10-28T22:42:21.167 に答える