2009-05-13 2 views
0

Пожалуйста, помогитеразметить модуль

Есть много признаков в модуле разметить шпагат, кавычка, 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 

Это то, что я experimented.But я не смог найти то, что они означают?

Откуда я это понимаю. Мне нужно немедленное решение.

+0

«Мне нужно немедленное решение». да? – SilentGhost

ответ

3

Чтобы понять детали, вам необходимо прочитать код python tokenizer.c. Просто найдите ключевое слово, которое хотите узнать. Должно быть не сложно.

2

Лексический анализ Python (включая токены) задокументирован в http://docs.python.org/reference/lexical_analysis.html. Поскольку http://docs.python.org/library/token.html#module-token говорит: «Обратитесь к файловому грамматике/грамматике в дистрибутиве Python для определения имен в контексте языковой грамматики».

2

Различные значения AMPER, BACKQUOTE и т. Д. Соответствуют номеру маркера соответствующего символа для токенов/операторов python. т.е. AMPER = & (амперсанд), AMPEREQUAL = "& =".

Однако на самом деле вам не нужно заботиться об этом. Они используются внутренним C tokeniser, но оболочка python упрощает вывод, переводя все символы оператора в токен OP. Вы можете перевести символические идентификаторы токена (первое значение в каждом токенном кортеже) на символическое имя, используя словарь 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. Это недокументированная, и похоже, что нет в 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. строки - фактический маркер текста для этот токен, например «&» или «строка»
  3. Начало (строка , столбец) на вашем входе
  4. Конец (строка, столбец) на вашем входе
  5. Полный текст строки, в которой находится токен.
Смежные вопросы