32.7. tokenize — PythonソースのTokenizer —Pythonドキュメント
32.7。 トークン化 —Pythonソースのトークナイザー
ソースコード: :source: `Lib / tokenize.py`
tokenize モジュールは、Pythonで実装されたPythonソースコードの字句スキャナーを提供します。 このモジュールのスキャナーはコメントもトークンとして返すため、オンスクリーンディスプレイ用のカラーライザーなどの「プリティプリンター」の実装に役立ちます。
トークンストリームの処理を簡素化するために、すべての Operators および Delimiters トークンは、汎用の token.OP トークンタイプを使用して返されます。 正確なタイプは、 tokenize.generate_tokens()から返されたタプルの2番目のフィールド(一致した実際のトークン文字列を含む)で、特定の演算子トークンを識別する文字シーケンスを確認することで判別できます。
プライマリエントリポイントはジェネレータです。
- tokenize.generate_tokens(readline)
generate_tokens()ジェネレーターには1つの引数 readline が必要です。これは、組み込みの readline()メソッドと同じインターフェイスを提供する呼び出し可能なオブジェクトである必要があります。ファイルオブジェクト(セクションファイルオブジェクトを参照)。 関数を呼び出すたびに、1行の入力が文字列として返されます。 あるいは、 readline は、
StopIteration
を上げることによって完了を通知する呼び出し可能なオブジェクトである場合があります。ジェネレータは、次のメンバーで5つのタプルを生成します。トークンタイプ。 トークン文字列。 ソースでトークンが始まる行と列を指定するintの2タプル
(srow, scol)
。 トークンがソースで終了する行と列を指定するintの2タプル(erow, ecol)
。 トークンが見つかった行。 渡された行(最後のタプル項目)は論理行です。 継続行が含まれています。バージョン2.2の新機能。
下位互換性のために、古いエントリポイントが保持されます。
- tokenize.tokenize(readline[, tokeneater])
tokenize()関数は、2つのパラメーターを受け入れます。1つは入力ストリームを表し、もう1つは tokenize()の出力メカニズムを提供します。
最初のパラメータ readline は、組み込みファイルオブジェクトの readline()メソッドと同じインターフェイスを提供する呼び出し可能なオブジェクトである必要があります(セクションファイルオブジェクトを参照) ])。 関数を呼び出すたびに、1行の入力が文字列として返されます。 あるいは、 readline は、
StopIteration
を上げることによって完了を通知する呼び出し可能なオブジェクトである場合があります。バージョン2.5で変更:
StopIteration
のサポートが追加されました。2番目のパラメーター tokeneater も、呼び出し可能なオブジェクトである必要があります。 generate_tokens()によって生成されたタプルに対応する5つの引数を使用して、トークンごとに1回呼び出されます。
token モジュールのすべての定数は、 tokenize からもエクスポートされ、 tokenizeによって tokeneater 関数に渡される可能性のある2つの追加のトークンタイプ値もエクスポートされます。 ():
- tokenize.COMMENT
- コメントを示すために使用されるトークン値。
- tokenize.NL
- 終了しない改行を示すために使用されるトークン値。 NEWLINEトークンは、Pythonコードの論理行の終わりを示します。 NLトークンは、コードの論理行が複数の物理行に続く場合に生成されます。
トークン化プロセスを逆にするための別の関数が提供されています。 これは、スクリプトをトークン化し、トークンストリームを変更し、変更されたスクリプトを書き戻すツールを作成する場合に役立ちます。
- tokenize.untokenize(iterable)
トークンをPythonソースコードに変換し直します。 iterable は、トークンタイプとトークン文字列の少なくとも2つの要素を持つシーケンスを返す必要があります。 追加のシーケンス要素は無視されます。
再構築されたスクリプトは、単一の文字列として返されます。 結果は、入力に一致するようにトークン化されることが保証されているため、変換はロスレスであり、ラウンドトリップが保証されます。 トークン間の間隔(列の位置)が変更される可能性があるため、保証はトークンタイプとトークン文字列にのみ適用されます。
バージョン2.5の新機能。
- exception tokenize.TokenError
数行に分割される可能性のあるdocstringまたは式のいずれかが、ファイルのどこにも完了していない場合に発生します。次に例を示します。
"""Beginning of docstring
or:
[1, 2, 3
Note that unclosed single-quoted strings do not cause an error to be raised. They are tokenized as ERRORTOKEN
, followed by the tokenization of their contents.
Example of a script re-writer that transforms float literals into Decimal objects:
def decistmt(s):
"""Substitute Decimals for floats in a string of statements.
>>> from decimal import Decimal
>>> s = 'print +21.3e-5*-.1234/81.7'
>>> decistmt(s)
"print +Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7')"
>>> exec(s)
-3.21716034272e-007
>>> exec(decistmt(s))
-3.217160342717258261933904529E-7
"""
result = []
g = generate_tokens(StringIO(s).readline) # tokenize the string
for toknum, tokval, _, _, _ in g:
if toknum == NUMBER and '.' in tokval: # replace NUMBER tokens
result.extend([
(NAME, 'Decimal'),
(OP, '('),
(STRING, repr(tokval)),
(OP, ')')
])
else:
result.append((toknum, tokval))
return untokenize(result)