【问题标题】:Odd behaviour of Python tokenizer when parsing integer numbers解析整数时 Python 标记器的奇怪行为
【发布时间】:2018-04-28 22:47:24
【问题描述】:
我注意到 CPython3 和 Pypy3 的以下事实,与 CPython2 和 Pypy2 的行为形成对比:
在 Python3 中,解析代码时看起来像前导零会产生错误除了一个非常单一的数字,即 0。因此00 有效但042 无效。
在 Python2 中,所有整数都允许前导零。因此00 和042 是有效的。
为什么 Python 在两个版本之间改变了它的行为?
【问题讨论】:
标签:
python
parsing
numbers
integer
token
【解决方案1】:
Python 3 标准化了所有整数文字(除了基数 10)的定义方式:0?dddd...,其中 ? 是一个表示基数的单个字母,每个 d 都被解释为相应基数中的一个数字。 0... 被保留为例外,因为 0 在任何基数中都是 0,并且在需要显式基数说明符之前被接受。
与此相关的最大变化是,带有前导零但没有显式基数说明符的数字不再被假定为八进制数。 Python 2 接受 042 和 0o42 作为十进制 34 的八进制表示。(在 Python 历史的早期,只有三个有效的文字,十六进制是唯一一个带有说明符的文字。0o... 和 0b... 都是后期补充