为什么在Python中对数字字面量调用方法会导致语法错误?

5

我只能在将数字绑定到名称时调用它们的方法:

>>> a = 5
>>> a.bit_length()
3

我可以对字符串字面值调用方法:

>>> 'Hello World'.lower()
'hello world'

但是我不能在数字字面量上调用方法:

>>> 5.bit_length()

这会引发一个“语法错误(SyntaxError)”。这是有实际原因还是历史原因导致的呢? 编辑 刚刚发现这个相关问题,它展示了一些解决方法(这些方法在此处也已经被建议过)。我想这也回答了主要问题——由于存在简单的解决方法,使语法更加复杂(难以解析)以使其工作的好处可能不足。

可能是为什么在int.to_bytes中括号不能省略?的重复问题。 - devnull
2个回答

8
浮点数按照以下规则进行解析,引用自文档:请看
floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [intpart] fraction | intpart "."
exponentfloat ::=  (intpart | pointfloat) exponent
intpart       ::=  digit+
fraction      ::=  "." digit+
exponent      ::=  ("e" | "E") ["+" | "-"] digit+

当Python看到5.时,它认为语法遵循[intpart] fraction | intpart "."规则。因此,它会选择下一个字符并发现它不符合fraction规则。这就是为什么会抛出语法错误的原因。
您可以通过以下方式解决这个问题:
5 .bit_length()

或者像这样用括号将其括起来。
(5).bit_length()

1
实际上,thefourtheye 稍有误解,语法错误的原因不是 fraction 规则未匹配。
语法错误的原因是该规则用于将其解析为浮点数:
pointfloat    ::=  [intpart] fraction | intpart "."

这个数字与第二种形式相匹配,该形式由整数部分后跟一个 . 组成 - 5. 是浮点数的有效字面量,并且由 5.bit_length 产生的标记流生成 2 个标记:5.(即浮点数 5.0)和 bit_length;在 Python 中,浮点文字面量后跟名称是语法错误。

然而,实际上可以使用两个点调用浮点数方法:

>>> 5.0.hex()
'0x1.4000000000000p+2'
>>> 5..hex()
'0x1.4000000000000p+2'

要调用 int 方法,你需要将 5. 分开,以便它们被解析为不同的标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接