tokenize模块

1 投票
3 回答
3663 浏览
提问于 2025-04-15 11:33

请帮帮我

在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

这是我做的一些实验。但我还是搞不清楚它们是什么意思?

我该从哪里去了解这些呢?我需要一个快速的解决办法。

3 个回答

2

Python的词法分析(包括标记)可以在这个链接找到:http://docs.python.org/reference/lexical_analysis.html。正如http://docs.python.org/library/token.html#module-token所说,“请查看Python安装包中的Grammar/Grammar文件,以了解语言语法中名称的定义。”

3

你需要查看Python的代码,特别是tokenizer.c这个文件,才能了解具体的细节。只要搜索你想知道的关键词就可以了,应该不会太难。

4

这里提到的各种 AMPER、BACKQUOTE 等值,实际上是 Python 中符号的代号,比如 AMPER 代表 &(也就是“和”符号),而 AMPEREQUAL 则是 "&="。

不过,你其实不需要太在意这些。它们是内部 C 语言的一个处理工具用的,但 Python 的包装器会把这些符号简化成 OP 这个代号。你可以通过 token 模块里的 tok_name 字典,把这些代号(每个代号元组中的第一个值)翻译成对应的符号名称。例如:

>>> 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。这个功能没有文档说明,而且在 Python 3 中似乎也没有,所以不要依赖它用于正式代码,但作为快速了解代号含义的工具,可能会对你有帮助:

>>> 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. 这个代号所在行的完整文本。

撰写回答