[3.13] Rename typing._collect_parameters (GH-118900) (#118917)

Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
Miss Islington (bot) 2024-05-10 19:40:39 +02:00 committed by GitHub
parent 6df49134b3
commit b3074f0d5e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 8 deletions

View file

@ -257,15 +257,15 @@ def _type_repr(obj):
return repr(obj)
def _collect_parameters(args, *, enforce_default_ordering: bool = True):
"""Collect all type variables and parameter specifications in args
def _collect_type_parameters(args, *, enforce_default_ordering: bool = True):
"""Collect all type parameters in args
in order of first appearance (lexicographic order).
For example::
>>> P = ParamSpec('P')
>>> T = TypeVar('T')
>>> _collect_parameters((T, Callable[P, T]))
>>> _collect_type_parameters((T, Callable[P, T]))
(~T, ~P)
"""
# required type parameter cannot appear after parameter with default
@ -281,7 +281,7 @@ def _collect_parameters(args, *, enforce_default_ordering: bool = True):
# `t` might be a tuple, when `ParamSpec` is substituted with
# `[T, int]`, or `[int, *Ts]`, etc.
for x in t:
for collected in _collect_parameters([x]):
for collected in _collect_type_parameters([x]):
if collected not in parameters:
parameters.append(collected)
elif hasattr(t, '__typing_subst__'):
@ -321,7 +321,7 @@ def _check_generic_specialization(cls, arguments):
if actual_len < expected_len:
# If the parameter at index `actual_len` in the parameters list
# has a default, then all parameters after it must also have
# one, because we validated as much in _collect_parameters().
# one, because we validated as much in _collect_type_parameters().
# That means that no error needs to be raised here, despite
# the number of arguments being passed not matching the number
# of parameters: all parameters that aren't explicitly
@ -1256,7 +1256,7 @@ def _generic_init_subclass(cls, *args, **kwargs):
if error:
raise TypeError("Cannot inherit from plain Generic")
if '__orig_bases__' in cls.__dict__:
tvars = _collect_parameters(cls.__orig_bases__)
tvars = _collect_type_parameters(cls.__orig_bases__)
# Look for Generic[T1, ..., Tn].
# If found, tvars must be a subset of it.
# If not found, tvars is it.
@ -1418,7 +1418,7 @@ class _GenericAlias(_BaseGenericAlias, _root=True):
self.__args__ = tuple(... if a is _TypingEllipsis else
a for a in args)
enforce_default_ordering = origin in (Generic, Protocol)
self.__parameters__ = _collect_parameters(
self.__parameters__ = _collect_type_parameters(
args,
enforce_default_ordering=enforce_default_ordering,
)
@ -3789,6 +3789,16 @@ def __getattr__(attr):
elif attr in {"ContextManager", "AsyncContextManager"}:
import contextlib
obj = _alias(getattr(contextlib, f"Abstract{attr}"), 2, name=attr, defaults=(bool | None,))
elif attr == "_collect_parameters":
import warnings
depr_message = (
"The private _collect_parameters function is deprecated and will be"
" removed in a future version of Python. Any use of private functions"
" is discouraged and may break in the future."
)
warnings.warn(depr_message, category=DeprecationWarning, stacklevel=2)
obj = _collect_type_parameters
else:
raise AttributeError(f"module {__name__!r} has no attribute {attr!r}")
globals()[attr] = obj