请帮忙
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
这是我试验过的。但我没能找到它们的意思?
从哪里我会明白这一点。我需要立即解决。
请您参考如下方法:
各种 AMPER、BACKQUOTE 等值对应于 python token /运算符的适当符号的 token 编号。即 AMPER = &(& 符号),AMPEREQUAL = "&="。
然而,你实际上不必关心这些。它们由内部 C 标记器使用,但 python 包装器简化了输出,将所有运算符符号转换为 OP 标记。您可以使用 token 模块的 tok_name 字典将符号 token ID(每个 token 元组中的第一个值)转换为符号名称。例如:
>>> 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
作为更好地描述 token 的快速调试语句,您还可以使用 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 ''
您为每个标记返回的元组中的各种值按顺序是:
- token Id(对应类型,例如STRING、OP、NAME等)
- 字符串 - 此标记的实际标记文本,例如“&”或“'a string'”
- 输入的开始(行、列)
- 输入的结尾(行、列)
- token 所在行的全文。
