使用前导零处理令牌

时间:2013-02-18 18:06:14

标签: python tokenize

用于标记输入表达式我正在使用tokenize.generate_tokens()

tokens = cStringIO.StringIO(SourceLine).readline
tokens = tokenize.generate_tokens(tokens)

现在,SourceLine = "Y123 = 00911 + 98 / 3"时 在tokens元组中,我得到以下标记值:

"Y123", "=" , "00", "911","+", "98" , "/" , "3"

然而,当我通过SourceLine = "Y123 = 00411 + 98 / 3"时,我得到了:

"Y123", "=" , "00411", "+" ,"98","/","3"

我不明白为什么在00911的第一种情况下,它生成了两个令牌00911而不是只有一个值为00911的令牌?

2 个答案:

答案 0 :(得分:4)

在Python 2中,以0开头的整数文字被解释为八进制数(基数为8)。因此,您的第一个SourceLine实际上在语法上无效,因为9不是八进制中的有效数字:

>>> Y123 = 00911 + 98 / 3
  File "<stdin>", line 1
    Y123 = 00911 + 98 / 3
               ^
SyntaxError: invalid token

因此,似乎tokenizer将它解析为十进制文字旁边的有效八进制文字。如果你试图解析一些类似Python的语言,你可以将它重新处理成你想要的格式。

答案 1 :(得分:3)

原因是tokenize将'00411'解释为八进制数,'00911'不是。所以它返回'00',一个有效的八进制数,后跟'911',一个有效的十进制数。