-
-
Notifications
You must be signed in to change notification settings - Fork 30.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
not operator expression raising a syntax error #68800
Comments
Expressions such as a + not b
raise a SyntaxError, for instance : >>> 0 + not 0
File "<stdin>", line 1
0 + not 0
^
SyntaxError: invalid syntax
>>> - not 0
File "<stdin>", line 1
- not 0
^
SyntaxError: invalid syntax
>>> if the not expression is wrapped in parenthesis, expected evaluation occurs: >>> - not 0
File "<stdin>", line 1
- not 0
^
SyntaxError: invalid syntax
>>> 0 + (not 0)
1
>>> - (not 0)
-1
>>> The problem has been first submitted in comp.lang.python : https://groups.google.com/forum/?hl=fr#!topic/comp.lang.python/iZiBs3tcuak suggesting a bug report. |
"not not 0" is compiled successful, while "+ not 0", "- not 0", and "~ not 0" are rejected. |
On Sat, Jul 11, 2015 at 03:23:53PM +0000, candide wrote:
>
> New submission from candide:
>
> Expressions such as
>
> a + not b
> a * not b
> + not b
> - not b
>
> raise a SyntaxError, for instance :
>
>
> >>> 0 + not 0
> File "<stdin>", line 1
> 0 + not 0
> ^
> SyntaxError: invalid syntax That has been invalid syntax since Python 1.5, if not older. I don't [steve@ando ~]$ python1.5
Python 1.5.2 (#1, Aug 27 2012, 09:09:18) [GCC 4.1.2 20080704 (Red Hat
4.1.2-52)] on linux2
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> 0 + not 0
File "<stdin>", line 1
0 + not 0
^
SyntaxError: invalid syntax |
It looks like perfectly valid syntax to me and I cannot see why it should be semantically rejected. I disagree that it shouldn't be changed. I think it's a (minor) bug that should eventually get fixed. |
"not" has a lower priority than unary "-"; this:
is parsed as:
How would you parse:
? Would it be parsed as:
? Similar remarks could apply to "yield":
which is also a syntax error. |
Hmm, right. I see your point and also the analogy with "yield". I could live with (maybe) giving it a better error message suggesting to use parentheses for clarity and otherwise keeping it a SyntaxError. |
Funny, I ran into this one or two days ago, when refactoring some code that used the bitwise exclusive-or operator, since there is no boolean exclusive or: -if (x == a) ^ (y != b): ...
+aa = x == a
+bb = y == b
+if aa ^ not bb: ... It is fairly clear what I wanted to do above, but with “is not” you would have to avoid ambiguity: >>> "spam" is not "ham" # Using “is not” operator
True
>>> "spam" is (not "ham") # Two distinct operators
False I think it would be too complicated to make unary “not” bind more tightly than “and” in some cases but not in others. How would you handle these cases? a + not b and c The way I see it, there is no equivalent problem with the other unary operators: arithmetic (+, -), bitwise (~), and “await”. Await has higher priority than all other binary operators, so no problem there. The other three are equal with the highest priority binary operator, exponentiation (**): >>> 2 ** -1 ** 2 # Evaluated right to left
0.5
>>> 2 ** (-1) ** 2 # Negation first
2
>>> (2 ** -1) ** 2 # Left-hand exponentiation first
0.25 BTW, in the operator precedence table <https://docs.python.org/dev/reference/expressions.html#operator-precedence\>, I think exponentiation should be in the same priority group as the arithmetic and bitwise unary operations. At the moment it says exponentiation has higher priority, but has a footnote saying this is reversed on the right-hand side of an exponentiation. This is unclear when applied to my example above. |
BTW “yield” is not a fair comparison because its syntax is even stranger (due to originally being a “yield” statement): def g():
x = yield + 1 # Yield the value +1
y = (yield) + 1 # Add 1 after yielding
return (yield) # Mandatory brackets |
Reproduced on 3.11: >>> 0 + not 0
File "<stdin>", line 1
0 + not 0
^^^
SyntaxError: invalid syntax
>>> - not 0
File "<stdin>", line 1
- not 0
^^^
SyntaxError: invalid syntax |
I think the best outcome here is to refine the syntax error. Making it behave a bit better is going to be quite a pain because of how unary "-" and "not" work on the priority level in the grammar. I also don't think that facilitating the concatenation of operators without parentheses is a good idea (for readability reasons). I will prepare a PR to improve the syntax error |
Fixed in #28170. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: