On Wed, Jun 24, 2020 at 5:30 AM Rob Cliffe via Python-Dev email@example.com wrote:
The PEP is great, but this strikes me as horribly confusing, given that 401|403|404 is already legal syntax. IIUC any legal expression can come between `case` and `:`, but expressions that contain `|` at their outermost level are interpreted differently than from in other contexts. Presumably adding parentheses: case (401|403|404): would make it equivalent to case 407:
Is a separator (other than whitespace) actually needed? Can the parser cope with case 401 403 404:
Failing that IMO preferable, albeit not ideal, possibilities would be
- Use colon as the separator.
- Use comma as the separator - this is already legal syntax too, but IMO it reads more naturally. (And IIRC there are already contexts where brackets are necessary to indicate a tuple.)
Perhaps someone can think of something better.
I also (with others) prefer `else:` or perhaps `case else:` to using the`_` variable. The latter is obscure, and woudn't sit well with code that already uses that variable for its own purposes.
It's not really arbitrary expressions, though. It's more like an assignment target list, but with some handling of constants.
case (x, y):
is very similar to
(x, y) = ...
There is the definite risk of confusion with 'if' statements, because you can say "case 401|403|404:" but you can't say "if x == 401|403|404:", and people already try to do that (usually with the 'or' keyword). I think the risk is worth it, given the expressiveness gained, but I can see the line of argument that it's going to cause confusion.