python3.x中的tokenize

时间:2011-02-10 00:35:40

标签: python porting distutils

我在python2.x中有以下代码:

class _CHAIN(object):

    def __init__(self, execution_context=None):
        self.execution_context = execution_context

    def eat(self, toktype, tokval, rowcol, line, logical_line):        
        #some code and error checking


operations = _CHAIN(execution_context)

tokenize(StringIO(somevalue).readline, operations.eat)

现在问题是在python3.x中第二个参数不存在。我需要在tokenize之前调用函数operations.eat()。我们如何在python3.x中执行上述任务。一个想法是在'tokenize'语句(代码的最后一行)之前直接调用函数tokenize.eat()。但我不确定要通过的论点。我敢肯定必须有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

根据http://docs.python.org/py3k/library/tokenize.html,您现在应该使用tokenize.tokenize(readline)

import tokenize
import io

class _CHAIN(object):

    def __init__(self, execution_context=None):
        self.execution_context = execution_context

    def eat(self, toktype, tokval, rowcol, line, logical_line):        
        #some code and error checking
        print(toktype, tokval, rowcol, line, logical_line)


operations = _CHAIN(None)

readline = io.StringIO('aaaa').readline

#Python 2 way:
#tokenize.tokenize(readline, operations.eat)

#Python 3 way:
for token in tokenize.generate_tokens(readline):
    operations.eat(token[0], token[1], token[2], token[3], token[4])

答案 1 :(得分:2)

你正在使用一个稍奇怪的遗留系统,你可以将函数传递给一个可调用的函数以及可以接受令牌的可调用函数。新方法在概念上更简单,适用于Python 2和3:

from tokenize import generate_tokens
for token in generate_tokens(StringIO(somevalue).readline):
    eat(token)

对于Python 3,这在技术上没有文档记录,但不太可能被删除。 Python 3中的官方tokenize函数需要字节,而不是字符串。 <{3}}用于标记字符串的官方API,但似乎已经停滞不前。