tokenize模块
请帮帮我
在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 ''
对于每个代号,你得到的元组中的各个值,按顺序是:
- 代号 ID(对应类型,比如 STRING、OP、NAME 等)
- 字符串 - 这个代号的实际文本,比如 "&" 或 "'a string'"
- 在输入中的起始位置(行,列)
- 在输入中的结束位置(行,列)
- 这个代号所在行的完整文本。