为什么1.__add__(1)会导致语法错误?
为什么
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