Feature or enhancement
There's already a similar rule:
|
| or_pattern 'as' !NAME a=expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "invalid pattern target") } |
But, it has two problems:
- It does not work for cases like
as a.b, because a matches NAME
- It does not show rich error message, only a static one:
invalid pattern target
My proposed change:
| or_pattern 'as' a=expression {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
a, "cannot use pattern target as %s", _PyPegen_get_expr_name(a)) }
Why is it safe?
Here's how the parent rule is defined:
as_pattern[pattern_ty]:
| pattern=or_pattern 'as' target=pattern_capture_target {
_PyAST_MatchAs(pattern, target->v.Name.id, EXTRA) }
| invalid_as_pattern
So, if pattern=or_pattern 'as' target=pattern_capture_target with a valid 'as' NAME is matched, we won't fall to the next invalid_ rule.
Proposed result:
>>> match 1:
... case x as a.b: ...
...
File "<python-input-0>", line 2
case x as a.b: ...
^^^
SyntaxError: cannot use pattern target as attribute
Refs #123440
Linked PRs
Feature or enhancement
There's already a similar rule:
cpython/Grammar/python.gram
Line 1378 in 084e0f3
But, it has two problems:
as a.b, becauseamatchesNAMEinvalid pattern targetMy proposed change:
Why is it safe?
Here's how the parent rule is defined:
So, if
pattern=or_pattern 'as' target=pattern_capture_targetwith a valid'as' NAMEis matched, we won't fall to the nextinvalid_rule.Proposed result:
Refs #123440
Linked PRs
SyntaxErrormessage forcase ... as a.b#123563