为什么
1.__add__(1)
收益率SyntaxError: invalid syntax
?额外括号添加了什么?
(1).__add__(1)
答案 0 :(得分:18)
这是令牌化工具的效果:1.__add__(1)
被分为令牌"1."
,"__add__"
,"("
,"1"
和{{1}因为tokenizer总是试图构建最长的令牌。第一个标记是一个浮点数,后面紧跟一个标识符,这对解析器没有意义,因此抛出")"
。
只需在点之前添加一个空格即可:
SyntaxError
答案 1 :(得分:8)
因为1.
是有效的浮点文字,而词法分析符遵循“最大符号”规则 - 使用最长匹配。将1.
作为浮点字面值使用后,标识符__add__
和parens会跟随。所有解析器都看到<float> <indentifier>
是无效的(比较1.0 __add__()
,这会产生相同的标记,我希望您看到它是如何语法错误的)并且毫无意义。在第二个示例中,表达式1
包含在parens中,然后一个点(单个标记,由解析器选取作为属性访问运算符)等,这显然是有效的。< / p>
答案 2 :(得分:2)
解析器希望找到一个浮点数,但_
不是有效数字。 parens告诉解析器在1
之后停止解析。