1

据此:http ://code.activestate.com/lists/python-list/413540/ ,tokenize.generate_tokens应该使用而不是tokenize.tokenize

这在Python 2.6. 但它不再适用于Python 3

>>> a = list(tokenize.generate_tokens(io.BytesIO("1\n".encode()).readline))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.2/tokenize.py", line 439, in _tokenize
    if line[pos] in '#\r\n':           # skip comments or blank lines

但是,在 中Python 3,这也有效(并且还返回所需的输出):

a = list(tokenize.tokenize(io.BytesIO("1\n".encode()).readline))

根据文档,似乎tokenize.tokenize是使用此模块的新方法:http: //docs.python.org/py3k/library/tokenize.htmltokenize.generate_tokens甚至不再记录。

generate_tokens但是,如果没有记录,为什么这个模块中还有一个功能?我还没有找到任何关于此的 PEP。

我正在尝试维护一个代码库,Python 2.5-3.2我应该调用和generate_tokensfor吗?没有更好的方法吗?Python 2tokenizePython 3

4

2 回答 2

1

generate_tokens似乎真的是一件奇怪的事情Python 3。它不像 in 那样工作Python 2。但是,tokenize.tokenize行为与旧的Python 2 tokenize.generate_tokens. 因此我写了一个小解决方法:

import tokenize                             
if sys.hexversion >= 0x03000000d:                               
    tokenize_func = tokenize.tokenize       
else:                                       
    tokenize_func = tokenize.generate_tokens

现在我只使用tokenize_func,它没有问题。

于 2012-07-17T22:33:47.723 回答
0

generate_tokens在 python3 中未记录但未注释。它的存在是为了向后兼容,因此您可以使用它,但最好使用更改后的tokenize...

于 2012-05-19T18:11:31.410 回答