用于标记输入表达式我正在使用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
的第一种情况下,它生成了两个令牌00
和911
而不是只有一个值为00911
的令牌?
答案 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',一个有效的十进制数。