你是對的;正如你所期望的那樣,Python將其解釋爲2 + (++2)
。您可以通過查看2 + 2和2 +++ 2編譯字節碼看到這一點,如下所示:
>>> dis.dis(lambda: 2+2)
1 0 LOAD_CONST 2 (4)
3 RETURN_VALUE
>>> dis.dis(lambda: 2+++2)
1 0 LOAD_CONST 1 (2)
3 LOAD_CONST 1 (2)
6 UNARY_POSITIVE
7 UNARY_POSITIVE
8 BINARY_ADD
9 RETURN_VALUE
你可能想知道爲什麼Python解析2 +++ 2這樣。首先,代碼被分解成記號:
>>> from cStringIO import StringIO
>>> import tokenize
>>> tokenize.generate_tokens(StringIO("2+++2").readline)
9 <generator object generate_tokens at 0x0000000007BC7480>
>>> list(tokenize.generate_tokens(StringIO("2+++2").readline))
10
[(2, '2', (1, 0), (1, 1), '2+++2'),
(51, '+', (1, 1), (1, 2), '2+++2'),
(51, '+', (1, 2), (1, 3), '2+++2'),
(51, '+', (1, 3), (1, 4), '2+++2'),
(2, '2', (1, 4), (1, 5), '2+++2'),
(0, '', (2, 0), (2, 0), '')]
它的解析器,然後憑證清單關聯成語法樹:
>>> st = ast.parse("2+++2")
>>> st
36 <_ast.Module at 0x7d2acc0>
>>> ast.dump(st)
37 'Module(body=[Expr(value=BinOp(left=Num(n=2), op=Add(), right=UnaryOp(op=UAdd(), operand=UnaryOp(op=UAdd(), operand=Num(n=2)))))])'
這是繼標準消歧規則。
這些都不明確(只有毫無意義),也沒有提出有關您正面臨的真正編程問題的問題。 – geoffspear 2013-03-20 11:16:08
此外,要求更模糊的表達式使得這個問題不具有建設性。 – 2013-03-20 11:16:52