mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
gh-116126: Implement PEP 696 (#116129)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
This commit is contained in:
parent
852263e108
commit
ca269e58c2
28 changed files with 1924 additions and 623 deletions
|
|
@ -1620,15 +1620,18 @@ Type parameter lists
|
|||
|
||||
.. versionadded:: 3.12
|
||||
|
||||
.. versionchanged:: 3.13
|
||||
Support for default values was added (see :pep:`696`).
|
||||
|
||||
.. index::
|
||||
single: type parameters
|
||||
|
||||
.. productionlist:: python-grammar
|
||||
type_params: "[" `type_param` ("," `type_param`)* "]"
|
||||
type_param: `typevar` | `typevartuple` | `paramspec`
|
||||
typevar: `identifier` (":" `expression`)?
|
||||
typevartuple: "*" `identifier`
|
||||
paramspec: "**" `identifier`
|
||||
typevar: `identifier` (":" `expression`)? ("=" `expression`)?
|
||||
typevartuple: "*" `identifier` ("=" `expression`)?
|
||||
paramspec: "**" `identifier` ("=" `expression`)?
|
||||
|
||||
:ref:`Functions <def>` (including :ref:`coroutines <async def>`),
|
||||
:ref:`classes <class>` and :ref:`type aliases <type>` may
|
||||
|
|
@ -1694,19 +1697,31 @@ evaluated in a separate :ref:`annotation scope <annotation-scopes>`.
|
|||
:data:`typing.TypeVarTuple`\ s and :data:`typing.ParamSpec`\ s cannot have bounds
|
||||
or constraints.
|
||||
|
||||
All three flavors of type parameters can also have a *default value*, which is used
|
||||
when the type parameter is not explicitly provided. This is added by appending
|
||||
a single equals sign (``=``) followed by an expression. Like the bounds and
|
||||
constraints of type variables, the default value is not evaluated when the
|
||||
object is created, but only when the type parameter's ``__default__`` attribute
|
||||
is accessed. To this end, the default value is evaluated in a separate
|
||||
:ref:`annotation scope <annotation-scopes>`. If no default value is specified
|
||||
for a type parameter, the ``__default__`` attribute is set to the special
|
||||
sentinel object :data:`typing.NoDefault`.
|
||||
|
||||
The following example indicates the full set of allowed type parameter declarations::
|
||||
|
||||
def overly_generic[
|
||||
SimpleTypeVar,
|
||||
TypeVarWithDefault = int,
|
||||
TypeVarWithBound: int,
|
||||
TypeVarWithConstraints: (str, bytes),
|
||||
*SimpleTypeVarTuple,
|
||||
**SimpleParamSpec,
|
||||
*SimpleTypeVarTuple = (int, float),
|
||||
**SimpleParamSpec = (str, bytearray),
|
||||
](
|
||||
a: SimpleTypeVar,
|
||||
b: TypeVarWithBound,
|
||||
c: Callable[SimpleParamSpec, TypeVarWithConstraints],
|
||||
*d: SimpleTypeVarTuple,
|
||||
b: TypeVarWithDefault,
|
||||
c: TypeVarWithBound,
|
||||
d: Callable[SimpleParamSpec, TypeVarWithConstraints],
|
||||
*e: SimpleTypeVarTuple,
|
||||
): ...
|
||||
|
||||
.. _generic-functions:
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ Annotation scopes are used in the following contexts:
|
|||
* Type parameter lists for :ref:`generic classes <generic-classes>`.
|
||||
A generic class's base classes and
|
||||
keyword arguments are executed within the annotation scope, but its decorators are not.
|
||||
* The bounds and constraints for type variables
|
||||
* The bounds, constraints, and default values for type parameters
|
||||
(:ref:`lazily evaluated <lazy-evaluation>`).
|
||||
* The value of type aliases (:ref:`lazily evaluated <lazy-evaluation>`).
|
||||
|
||||
|
|
@ -232,13 +232,17 @@ Annotation scopes differ from function scopes in the following ways:
|
|||
.. versionadded:: 3.12
|
||||
Annotation scopes were introduced in Python 3.12 as part of :pep:`695`.
|
||||
|
||||
.. versionchanged:: 3.13
|
||||
Annotation scopes are also used for type parameter defaults, as
|
||||
introduced by :pep:`696`.
|
||||
|
||||
.. _lazy-evaluation:
|
||||
|
||||
Lazy evaluation
|
||||
---------------
|
||||
|
||||
The values of type aliases created through the :keyword:`type` statement are
|
||||
*lazily evaluated*. The same applies to the bounds and constraints of type
|
||||
*lazily evaluated*. The same applies to the bounds, constraints, and default values of type
|
||||
variables created through the :ref:`type parameter syntax <type-params>`.
|
||||
This means that they are not evaluated when the type alias or type variable is
|
||||
created. Instead, they are only evaluated when doing so is necessary to resolve
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue