为什么1.__add__(1)会导致语法错误?

11 投票
3 回答
585 浏览
提问于 2025-04-17 12:30

为什么

1.__add__(1)

会出现 SyntaxError: invalid syntax 的错误呢?这些多余的括号有什么用呢?

(1).__add__(1)

3 个回答

2

解析器(就是负责分析代码的部分)本来是想找到一个浮点数(也就是带小数点的数字),但是_这个符号不是一个有效的数字。括号的意思是告诉解析器在看到1之后就停止分析了。

8

因为 1. 是一个有效的浮点数表示,词法分析器遵循“最大匹配”规则,也就是说它会选择最长的匹配项。在这里,1. 被当作浮点数处理,然后后面跟着标识符 __add__ 和括号。解析器看到的就是 <float> <identifier>,这在语法上是无效的(对比一下 1.0 __add__(),它产生了相同的标记,我希望你能明白这也是一个语法错误),而且没有意义。在第二个例子中,有一个被括号包裹的表达式 1,然后是一个点(这是一个单独的标记,被解析器当作属性访问操作符),这显然是有效的。

18

这是一个关于分词器的效果:1.__add__(1) 被分成了几个部分,分别是 "1.""__add__""(""1"")"。分词器总是尽量把字符组合成最长的部分。第一个部分是一个浮点数,后面紧跟着一个标识符,这对解析器来说没有意义,所以它就报了一个 SyntaxError(语法错误)。

只需在点前面加一个空格,这样就可以正常工作了:

>>> 1 .__add__(1)
2

撰写回答