https://docs.python.org/3/reference/lexical_analysis.html#wh...
https://docs.python.org/3/reference/lexical_analysis.html#wh...
Also Python: Meh, you can leave out the whitespace, I'll figure it out
I've never encountered this issue before.
The reason I've never encountered this issue, or even needed to know it was an issue is because I use good development tools. 1) Pycharm highlighted the or in orange, making it clear that it was being interpreted as a keyword, 2) I use a linter (as we all should) which explicitly highlights the lack of whitespace around the token as an issue (PEP 8: E225), and 3) I use a code formatter (which we all should) which, again, highlights this statement as requests that I fix it.
Python has a lot of flaws. This one is down near the bottom of ones that are even really worth talking about.
You're taking my statement way too personally and out of context. You and everyone else can express your opinions all you want.
As a topic in the list of "flaws with Python," I don't think it's a very important or insightful topic because it's not something people really run into. This just doesn't fit there.
This is a novelty, pure and simple. Filed under "weird programming hacks you won't expect" This would be fine. It's like, `([]+![])[+!+[]+!+[]+!+[]][([]+{})]` in javascript. Weird, kind of interesting, but it's not really a "flaw," at least not the sense of something that will burn you unexpectedly.
Reminds me of Fortran.
When we were in college learning FORTRAN, students would ask for help from the teaching assistants at the computer center. One big problem was FORTRAN allowed horrible spaghetti code because GOTO statements could be used anywhere. It was easy to jump into and out from loops. The TAs had a tough job.
It didn't help when people would deliberately mess with the TAs by asking about code with language features similar to those in the article you linked. Something like IIRC after 47 years:
DO 15 I = (1, 100)
purported loop stuff goes here
15 final statement of loop
That is also not a loop control statement. Instead it is an assignment to a complex number. % cat 0xfor.py
0xfor 1
% python -m tokenize -e '0xfor.py'
0,0-0,0: ENCODING 'utf-8'
1,0-1,3: NUMBER '0xf'
1,3-1,5: NAME 'or'
1,6-1,7: NUMBER '1'
1,7-1,8: NEWLINE '\n'
2,0-2,0: ENDMARKER ''
Also, literals have to be evaluated before names, otherwise you could overwrite them: >>> 0xzzz = 1
File "<stdin>", line 1
0xzzz = 1
^
SyntaxError: invalid hexadecimal literal
>>> 0xf = 1
File "<stdin>", line 1
0xf = 1
^
SyntaxError: cannot assign to literal
[0]: https://docs.python.org/3/library/stdtypes.html#float.fromhe...[1]: https://github.com/python/cpython/blob/5ce227f3a767e6e44e7c4...
[2]: https://github.com/python/cpython/blob/5ce227f3a767e6e44e7c4...
> the first thing it sees looks like the start of a number
Yes, because it checks if the token is a number before checking if it is a name.
But to know if a token is a name, it has to check, and that check never happens because the tokenizer yields when the number case hits. You can attach a debugger and see for yourself.
> It doesn't matter in which order the rules are checked.
Nowhere did I claim otherwise. The rules _do_ happen in a deterministic order, which I posted the source code for.
> Nowhere did I claim otherwise.
You claimed otherwise when you wrote "Because the hexadecimal parsing rule [0] happens before [1] the rule that parses names [2]", and when you wrote "literals have to be evaluated before names", and when you wrote "the rules can’t be evaluated concurrently". That is, you claimed otherwise in every single one of your posts in this subthread.
You are conflating the fact that there is an order to the rules with a strawman that the rules _must_ be evaluated in a specific order. All of the quotes you pulled are facts (Python checks if a token is a number before it checks if it is a name, Python checks if a token is a literal before it checks if it is a name, and the rules are not evaluated concurrently), but your strawman is making a different claim.
I'm not the one who wrote "literals have to be evaluated before names".
> rules are not evaluated concurrently
Strawman yourself. I didn't say they were evaluated concurrently, I said that your claim that they can't be evaluated concurrently was wrong. They could be, because they are disjoint, and regardless of order only one of them can match at input starting with a '0' character.
Anyway, I'm done here.
This isn't a bug. It's a slightly loose grammar spec that can surprise python users who don't play golf.