PEP 622: Rename name pattern to capture pattern (#1479)
Also make the section headings describing various types of patterns plural, e.g. "Capture patterns".
This commit is contained in:
parent
5aec654f9e
commit
d3bcd15cd2
64
pep-0622.rst
64
pep-0622.rst
|
@ -143,7 +143,7 @@ A simplified, approximate grammar for the proposed syntax is::
|
||||||
or_pattern: closed_pattern ('|' closed_pattern)*
|
or_pattern: closed_pattern ('|' closed_pattern)*
|
||||||
closed_pattern:
|
closed_pattern:
|
||||||
| literal_pattern
|
| literal_pattern
|
||||||
| name_pattern
|
| capture_pattern
|
||||||
| constant_pattern
|
| constant_pattern
|
||||||
| sequence_pattern
|
| sequence_pattern
|
||||||
| mapping_pattern
|
| mapping_pattern
|
||||||
|
@ -183,7 +183,7 @@ statements. Note that unlike for the previously proposed ``switch`` statement,
|
||||||
the pre-computed dispatch dictionary semantics does not apply here.
|
the pre-computed dispatch dictionary semantics does not apply here.
|
||||||
|
|
||||||
There is no ``default`` or ``else`` case - instead the special wildcard
|
There is no ``default`` or ``else`` case - instead the special wildcard
|
||||||
``_`` can be used (see the section on `name_pattern`_) as a final
|
``_`` can be used (see the section on `capture_pattern`_) as a final
|
||||||
'catch-all' pattern.
|
'catch-all' pattern.
|
||||||
|
|
||||||
Name bindings made during a successful pattern match outlive the executed suite
|
Name bindings made during a successful pattern match outlive the executed suite
|
||||||
|
@ -210,8 +210,8 @@ building blocks. The following patterns are supported:
|
||||||
|
|
||||||
.. _literal_pattern:
|
.. _literal_pattern:
|
||||||
|
|
||||||
Literal Pattern
|
Literal Patterns
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
A literal pattern consists of a simple literal like a string, a number,
|
A literal pattern consists of a simple literal like a string, a number,
|
||||||
a Boolean literal (``True`` or ``False``), or ``None``::
|
a Boolean literal (``True`` or ``False``), or ``None``::
|
||||||
|
@ -251,12 +251,12 @@ are supported. F-strings are not allowed (since in general they are not
|
||||||
really literals).
|
really literals).
|
||||||
|
|
||||||
|
|
||||||
.. _name_pattern:
|
.. _capture_pattern:
|
||||||
|
|
||||||
Name Pattern
|
Capture Patterns
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
A name pattern serves as an assignment target for the matched expression::
|
A capture pattern serves as an assignment target for the matched expression::
|
||||||
|
|
||||||
match greeting:
|
match greeting:
|
||||||
case "":
|
case "":
|
||||||
|
@ -264,7 +264,7 @@ A name pattern serves as an assignment target for the matched expression::
|
||||||
case name:
|
case name:
|
||||||
print(f"Hi {name}!")
|
print(f"Hi {name}!")
|
||||||
|
|
||||||
A name pattern always succeeds. A name pattern appearing in a scope makes
|
A capture pattern always succeeds. A capture pattern appearing in a scope makes
|
||||||
the name local to that scope. For example, using ``name`` after the above
|
the name local to that scope. For example, using ``name`` after the above
|
||||||
snippet may raise ``UnboundLocalError`` rather than ``NameError``, if
|
snippet may raise ``UnboundLocalError`` rather than ``NameError``, if
|
||||||
the ``""`` case clause was taken::
|
the ``""`` case clause was taken::
|
||||||
|
@ -278,7 +278,7 @@ the ``""`` case clause was taken::
|
||||||
... # but works fine if greeting was not empty
|
... # but works fine if greeting was not empty
|
||||||
|
|
||||||
While matching against each case clause, a name may be bound at most
|
While matching against each case clause, a name may be bound at most
|
||||||
once, having two name patterns with coinciding names is an error. An
|
once, having two capture patterns with coinciding names is an error. An
|
||||||
exception is made for the special single underscore (``_``) name; in
|
exception is made for the special single underscore (``_``) name; in
|
||||||
patterns, it's a wildcard that *never* binds::
|
patterns, it's a wildcard that *never* binds::
|
||||||
|
|
||||||
|
@ -299,14 +299,14 @@ literals, not names.
|
||||||
|
|
||||||
.. _constant_value_pattern:
|
.. _constant_value_pattern:
|
||||||
|
|
||||||
Constant Value Pattern
|
Constant Value Patterns
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
This is used to match against constants and enum values.
|
This is used to match against constants and enum values.
|
||||||
Every dotted name in a pattern is looked up using normal Python name
|
Every dotted name in a pattern is looked up using normal Python name
|
||||||
resolution rules, and the value is used for comparison by equality with
|
resolution rules, and the value is used for comparison by equality with
|
||||||
the matching expression (same as for literals). As a special case to avoid
|
the matching expression (same as for literals). As a special case to avoid
|
||||||
ambiguity with name patterns, simple names must be prefixed with a dot to be
|
ambiguity with capture patterns, simple names must be prefixed with a dot to be
|
||||||
considered a reference::
|
considered a reference::
|
||||||
|
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
@ -332,8 +332,8 @@ for constant value pattern.
|
||||||
|
|
||||||
.. _sequence_pattern:
|
.. _sequence_pattern:
|
||||||
|
|
||||||
Sequence Pattern
|
Sequence Patterns
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
A sequence pattern follows the same semantics as unpacking assignment.
|
A sequence pattern follows the same semantics as unpacking assignment.
|
||||||
Like unpacking assignment, both tuple-like and list-like syntax can be
|
Like unpacking assignment, both tuple-like and list-like syntax can be
|
||||||
|
@ -363,8 +363,8 @@ example:
|
||||||
|
|
||||||
.. _mapping_pattern:
|
.. _mapping_pattern:
|
||||||
|
|
||||||
Mapping Pattern
|
Mapping Patterns
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Mapping pattern is a generalization of iterable unpacking to mappings.
|
Mapping pattern is a generalization of iterable unpacking to mappings.
|
||||||
Its syntax is similar to dictionary display but each key and value are
|
Its syntax is similar to dictionary display but each key and value are
|
||||||
|
@ -398,8 +398,8 @@ were already present when the ``match`` block was entered.
|
||||||
|
|
||||||
.. _class_pattern:
|
.. _class_pattern:
|
||||||
|
|
||||||
Class Pattern
|
Class Patterns
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
A class pattern provides support for destructuring arbitrary objects.
|
A class pattern provides support for destructuring arbitrary objects.
|
||||||
There are two possible ways of matching on object attributes: by position
|
There are two possible ways of matching on object attributes: by position
|
||||||
|
@ -514,7 +514,7 @@ Named sub-patterns
|
||||||
|
|
||||||
It is often useful to match a sub-pattern *and* to bind the corresponding
|
It is often useful to match a sub-pattern *and* to bind the corresponding
|
||||||
value to a name. For example, it can be useful to write more efficient
|
value to a name. For example, it can be useful to write more efficient
|
||||||
matches, or simply to avoid repetition. To simplify such cases, a name pattern
|
matches, or simply to avoid repetition. To simplify such cases, a capture pattern
|
||||||
can be combined with another arbitrary pattern using named sub-patterns of
|
can be combined with another arbitrary pattern using named sub-patterns of
|
||||||
the form ``name := pattern``. For example::
|
the form ``name := pattern``. For example::
|
||||||
|
|
||||||
|
@ -522,7 +522,7 @@ the form ``name := pattern``. For example::
|
||||||
case Line(start := Point(x, y), end) if start == end:
|
case Line(start := Point(x, y), end) if start == end:
|
||||||
print(f"Zero length line at {x}, {y}")
|
print(f"Zero length line at {x}, {y}")
|
||||||
|
|
||||||
Note that the name pattern used in the named sub-pattern can be used in
|
Note that the capture pattern used in the named sub-pattern can be used in
|
||||||
the match suite, or after the match statement. However, the name will
|
the match suite, or after the match statement. However, the name will
|
||||||
*only* be bound if the sub-pattern succeeds. Another example::
|
*only* be bound if the sub-pattern succeeds. Another example::
|
||||||
|
|
||||||
|
@ -885,7 +885,7 @@ variables. For example::
|
||||||
Note about constants
|
Note about constants
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
The fact that name pattern is always an assignment target may create unwanted
|
The fact that a capture pattern is always an assignment target may create unwanted
|
||||||
consequences when a user by mistake tries to "match" a value against
|
consequences when a user by mistake tries to "match" a value against
|
||||||
a constant instead of using the constant value pattern. As a result, at
|
a constant instead of using the constant value pattern. As a result, at
|
||||||
runtime such match will always succeed and moreover override the value of
|
runtime such match will always succeed and moreover override the value of
|
||||||
|
@ -1181,10 +1181,10 @@ Alternatives for constant value pattern
|
||||||
|
|
||||||
This is probably the trickiest item. Matching against some pre-defined
|
This is probably the trickiest item. Matching against some pre-defined
|
||||||
constants is very common, but the dynamic nature of Python also makes it
|
constants is very common, but the dynamic nature of Python also makes it
|
||||||
ambiguous with name patterns. Four other alternatives were considered:
|
ambiguous with capture patterns. Four other alternatives were considered:
|
||||||
|
|
||||||
* Use some implicit rules. For example if a name was defined in the global
|
* Use some implicit rules. For example if a name was defined in the global
|
||||||
scope, then it refers to a constant, rather than represents a name pattern::
|
scope, then it refers to a constant, rather than represents a capture pattern::
|
||||||
|
|
||||||
FOO = 1
|
FOO = 1
|
||||||
value = 0
|
value = 0
|
||||||
|
@ -1199,7 +1199,7 @@ ambiguous with name patterns. Four other alternatives were considered:
|
||||||
defines an unrelated coinciding name before the match statement.
|
defines an unrelated coinciding name before the match statement.
|
||||||
|
|
||||||
* Use a rule based on the case of a name. In particular, if the name
|
* Use a rule based on the case of a name. In particular, if the name
|
||||||
starts with a lowercase letter it would be a name pattern, while if
|
starts with a lowercase letter it would be a capture pattern, while if
|
||||||
it starts with uppercase it would refer to a constant::
|
it starts with uppercase it would refer to a constant::
|
||||||
|
|
||||||
FOO = 1
|
FOO = 1
|
||||||
|
@ -1253,7 +1253,7 @@ ambiguous with name patterns. Four other alternatives were considered:
|
||||||
narrow use-case is probably an overkill.
|
narrow use-case is probably an overkill.
|
||||||
|
|
||||||
* There was also on idea to make lookup semantics the default, and require
|
* There was also on idea to make lookup semantics the default, and require
|
||||||
``$`` to be used in name patterns::
|
``$`` to be used in capture patterns::
|
||||||
|
|
||||||
FOO = 1
|
FOO = 1
|
||||||
value = 0
|
value = 0
|
||||||
|
@ -1264,7 +1264,7 @@ ambiguous with name patterns. Four other alternatives were considered:
|
||||||
case $BAR: # This would be matched
|
case $BAR: # This would be matched
|
||||||
...
|
...
|
||||||
|
|
||||||
But the name patterns are more common in typical code, so having special
|
But the capture patterns are more common in typical code, so having special
|
||||||
syntax for common case would be weird.
|
syntax for common case would be weird.
|
||||||
|
|
||||||
In the end, these alternatives were rejected because of the mentioned drawbacks.
|
In the end, these alternatives were rejected because of the mentioned drawbacks.
|
||||||
|
@ -1556,7 +1556,7 @@ value was equal to the value previously bound. If the value was not equal,
|
||||||
the match would fail.
|
the match would fail.
|
||||||
|
|
||||||
However, there are a number of subtleties involved with mixing load-store
|
However, there are a number of subtleties involved with mixing load-store
|
||||||
semantics for name patterns. For the moment, we decided to make repeated
|
semantics for capture patterns. For the moment, we decided to make repeated
|
||||||
use of names within the same pattern an error; we can always relax this
|
use of names within the same pattern an error; we can always relax this
|
||||||
restriction later without affecting backwards compatibility.
|
restriction later without affecting backwards compatibility.
|
||||||
|
|
||||||
|
@ -1731,14 +1731,14 @@ Other notation used beyond standard EBNF:
|
||||||
pattern: NAME ':=' or_pattern | or_pattern
|
pattern: NAME ':=' or_pattern | or_pattern
|
||||||
or_pattern: '|'.closed_pattern+
|
or_pattern: '|'.closed_pattern+
|
||||||
closed_pattern:
|
closed_pattern:
|
||||||
| name_pattern
|
| capture_pattern
|
||||||
| literal_pattern
|
| literal_pattern
|
||||||
| constant_pattern
|
| constant_pattern
|
||||||
| group_pattern
|
| group_pattern
|
||||||
| sequence_pattern
|
| sequence_pattern
|
||||||
| mapping_pattern
|
| mapping_pattern
|
||||||
| class_pattern
|
| class_pattern
|
||||||
name_pattern: NAME !('.' | '(' | '=')
|
capture_pattern: NAME !('.' | '(' | '=')
|
||||||
literal_pattern:
|
literal_pattern:
|
||||||
| signed_number !('+' | '-')
|
| signed_number !('+' | '-')
|
||||||
| signed_number '+' NUMBER
|
| signed_number '+' NUMBER
|
||||||
|
@ -1762,10 +1762,10 @@ Other notation used beyond standard EBNF:
|
||||||
values_pattern: ','.value_pattern+ ','?
|
values_pattern: ','.value_pattern+ ','?
|
||||||
items_pattern: ','.key_value_pattern+ ','?
|
items_pattern: ','.key_value_pattern+ ','?
|
||||||
keyword_pattern: NAME '=' or_pattern
|
keyword_pattern: NAME '=' or_pattern
|
||||||
value_pattern: '*' name_pattern | pattern
|
value_pattern: '*' capture_pattern | pattern
|
||||||
key_value_pattern:
|
key_value_pattern:
|
||||||
| (literal_pattern | constant_pattern) ':' or_pattern
|
| (literal_pattern | constant_pattern) ':' or_pattern
|
||||||
| '**' name_pattern
|
| '**' capture_pattern
|
||||||
|
|
||||||
|
|
||||||
Copyright
|
Copyright
|
||||||
|
|
Loading…
Reference in New Issue