1

助けてください

モジュールtokenizeには、STRING、BACKQUOTE、AMPEREQUALなどの多くのトークンがあります。

>>> import cStringIO
>>> import tokenize
>>> source = "{'test':'123','hehe':['hooray',0x10]}"
>>> src = cStringIO.StringIO(source).readline
>>> src = tokenize.generate_tokens(src)
>>> src
<generator object at 0x00BFBEE0>
>>> src.next()
(51, '{', (1, 0), (1, 1), "{'test':'123','hehe':['hooray',0x10]}")
>>> token = src.next()
>>> token
(3, "'test'", (1, 1), (1, 7), "{'test':'123','hehe':['hooray',0x10]}")
>>> token[0]
3
>>> tokenize.STRING
3
>>> tokenize.AMPER
19
>>> tokenize.AMPEREQUAL
42
>>> tokenize.AT
50
>>> tokenize.BACKQUOTE
25

これは私が実験したものですが、それらが何を意味するのかを見つけることができませんでしたか?

そこから私はこれを理解します。私は即時の解決策が必要です。

4

3 に答える 3

4

AMPER、BACKQUOTE などのさまざまな値は、python トークン/演算子の適切なシンボルのトークン番号に対応しています。つまり、AMPER = & (アンパサンド)、AMPEREQUAL = "&=" です。

ただし、実際にはこれらを気にする必要はありません。これらは内部 C トークナイザーによって使用されますが、python ラッパーは出力を簡素化し、すべての演算子記号をOPトークンに変換します。トークン モジュールの tok_name ディクショナリを使用して、シンボリック トークン ID (各トークン タプルの最初の値) をシンボリック名に変換できます。例えば:

>>> import tokenize, token
>>> s = "{'test':'123','hehe':['hooray',0x10]}"
>>> for t in tokenize.generate_tokens(iter([s]).next):
        print token.tok_name[t[0]],

OP STRING OP STRING OP STRING OP OP STRING OP NUMBER OP OP ENDMARKER

トークンをもう少し適切に説明する簡単なデバッグ ステートメントとして、tokenize.printtoken を使用することもできます。これは文書化されておらず、python3 には存在しないように見えるため、製品コードに依存しないでください。ただし、トークンの意味をざっと見てみると、役立つ場合があります。

>>> for t in tokenize.generate_tokens(iter([s]).next):
        tokenize.printtoken(*t)

1,0-1,1:        OP      '{'
1,1-1,7:        STRING  "'test'"
1,7-1,8:        OP      ':'
1,8-1,13:       STRING  "'123'"
1,13-1,14:      OP      ','
1,14-1,20:      STRING  "'hehe'"
1,20-1,21:      OP      ':'
1,21-1,22:      OP      '['
1,22-1,30:      STRING  "'hooray'"
1,30-1,31:      OP      ','
1,31-1,35:      NUMBER  '0x10'
1,35-1,36:      OP      ']'
1,36-1,37:      OP      '}'
2,0-2,0:        ENDMARKER       ''

各トークンに対して返されるタプルのさまざまな値は次のとおりです。

  1. トークン ID (STRING、OP、NAME などのタイプに対応)
  2. 文字列 - このトークンの実際のトークン テキスト (例: "&" または "'a string'")
  3. 入力の開始 (行、列)
  4. 入力の末尾 (行、列)
  5. トークンがある行の全文。
于 2009-05-14T08:52:08.310 に答える
3

詳細を理解するには、 Pythonのコードtokenizer.cを読む必要があります。知りたいキーワードを検索するだけです。難しいことではありません。

于 2009-05-13T08:43:01.573 に答える
2

Pythonの字句解析(トークンを含む)は、http://docs.python.org/reference/lexical_analysis.htmlに文書化されています。http://docs.python.org/library/token.html#module-tokenが言うように、「言語文法のコンテキストでの名前の定義については、PythonディストリビューションのファイルGrammar/Grammarを参照してください。」

于 2009-05-13T08:44:21.710 に答える