aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Lib/typing.py
diff options
context:
space:
mode:
authorrobot-contrib <robot-contrib@yandex-team.com>2024-07-02 22:47:57 +0300
committerrobot-contrib <robot-contrib@yandex-team.com>2024-07-02 22:59:47 +0300
commit96b239778766d32d5158aca805e08199b3c0a743 (patch)
treea9c8679261a62138ec4735d878a11f6478cd196a /contrib/tools/python3/Lib/typing.py
parent292e7317266c2136a1e1bd027e16e6eefb639028 (diff)
downloadydb-96b239778766d32d5158aca805e08199b3c0a743.tar.gz
Update contrib/tools/python3 to 3.12.4
6e8edffbef193b35b45ddccdc3beda6bb2627186
Diffstat (limited to 'contrib/tools/python3/Lib/typing.py')
-rw-r--r--contrib/tools/python3/Lib/typing.py40
1 files changed, 30 insertions, 10 deletions
diff --git a/contrib/tools/python3/Lib/typing.py b/contrib/tools/python3/Lib/typing.py
index b58c2d3064..882dc4da58 100644
--- a/contrib/tools/python3/Lib/typing.py
+++ b/contrib/tools/python3/Lib/typing.py
@@ -403,7 +403,8 @@ def _tp_cache(func=None, /, *, typed=False):
return decorator
-def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
+
+def _eval_type(t, globalns, localns, type_params=None, *, recursive_guard=frozenset()):
"""Evaluate all forward references in the given type t.
For use of globalns and localns see the docstring for get_type_hints().
@@ -411,7 +412,7 @@ def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
ForwardRef.
"""
if isinstance(t, ForwardRef):
- return t._evaluate(globalns, localns, recursive_guard)
+ return t._evaluate(globalns, localns, type_params, recursive_guard=recursive_guard)
if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)):
if isinstance(t, GenericAlias):
args = tuple(
@@ -425,7 +426,13 @@ def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
t = t.__origin__[args]
if is_unpacked:
t = Unpack[t]
- ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
+
+ ev_args = tuple(
+ _eval_type(
+ a, globalns, localns, type_params, recursive_guard=recursive_guard
+ )
+ for a in t.__args__
+ )
if ev_args == t.__args__:
return t
if isinstance(t, GenericAlias):
@@ -906,7 +913,7 @@ class ForwardRef(_Final, _root=True):
self.__forward_is_class__ = is_class
self.__forward_module__ = module
- def _evaluate(self, globalns, localns, recursive_guard):
+ def _evaluate(self, globalns, localns, type_params=None, *, recursive_guard):
if self.__forward_arg__ in recursive_guard:
return self
if not self.__forward_evaluated__ or localns is not globalns:
@@ -920,14 +927,25 @@ class ForwardRef(_Final, _root=True):
globalns = getattr(
sys.modules.get(self.__forward_module__, None), '__dict__', globalns
)
+ if type_params:
+ # "Inject" type parameters into the local namespace
+ # (unless they are shadowed by assignments *in* the local namespace),
+ # as a way of emulating annotation scopes when calling `eval()`
+ locals_to_pass = {param.__name__: param for param in type_params} | localns
+ else:
+ locals_to_pass = localns
type_ = _type_check(
- eval(self.__forward_code__, globalns, localns),
+ eval(self.__forward_code__, globalns, locals_to_pass),
"Forward references must evaluate to types.",
is_argument=self.__forward_is_argument__,
allow_special_forms=self.__forward_is_class__,
)
self.__forward_value__ = _eval_type(
- type_, globalns, localns, recursive_guard | {self.__forward_arg__}
+ type_,
+ globalns,
+ localns,
+ type_params,
+ recursive_guard=(recursive_guard | {self.__forward_arg__}),
)
self.__forward_evaluated__ = True
return self.__forward_value__
@@ -1686,8 +1704,9 @@ class _UnpackGenericAlias(_GenericAlias, _root=True):
assert self.__origin__ is Unpack
assert len(self.__args__) == 1
arg, = self.__args__
- if isinstance(arg, _GenericAlias):
- assert arg.__origin__ is tuple
+ if isinstance(arg, (_GenericAlias, types.GenericAlias)):
+ if arg.__origin__ is not tuple:
+ raise TypeError("Unpack[...] must be used with a tuple type")
return arg.__args__
return None
@@ -2241,7 +2260,7 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
value = type(None)
if isinstance(value, str):
value = ForwardRef(value, is_argument=False, is_class=True)
- value = _eval_type(value, base_globals, base_locals)
+ value = _eval_type(value, base_globals, base_locals, base.__type_params__)
hints[name] = value
return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
@@ -2267,6 +2286,7 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
raise TypeError('{!r} is not a module, class, method, '
'or function.'.format(obj))
hints = dict(hints)
+ type_params = getattr(obj, "__type_params__", ())
for name, value in hints.items():
if value is None:
value = type(None)
@@ -2278,7 +2298,7 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
is_argument=not isinstance(obj, types.ModuleType),
is_class=False,
)
- hints[name] = _eval_type(value, globalns, localns)
+ hints[name] = _eval_type(value, globalns, localns, type_params)
return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}