mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
[3.14] gh-136316: Make typing.evaluate_forward_ref better at evaluating nested forwardrefs (GH-136319) (#136346)
Some checks are pending
Tests / (push) Blocked by required conditions
Tests / Windows MSI (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Check if the ABI has changed (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
Lint / lint (push) Waiting to run
Some checks are pending
Tests / (push) Blocked by required conditions
Tests / Windows MSI (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Check if the ABI has changed (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
Lint / lint (push) Waiting to run
(cherry picked from commit 9312702d2e
)
This commit is contained in:
parent
bd97cb8229
commit
3d01565da4
4 changed files with 23 additions and 3 deletions
|
@ -7328,6 +7328,12 @@ class EvaluateForwardRefTests(BaseTestCase):
|
||||||
list[EqualToForwardRef('A')],
|
list[EqualToForwardRef('A')],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_with_module(self):
|
||||||
|
from test.typinganndata import fwdref_module
|
||||||
|
|
||||||
|
typing.evaluate_forward_ref(
|
||||||
|
fwdref_module.fw,)
|
||||||
|
|
||||||
|
|
||||||
class CollectionsAbcTests(BaseTestCase):
|
class CollectionsAbcTests(BaseTestCase):
|
||||||
|
|
||||||
|
|
6
Lib/test/typinganndata/fwdref_module.py
Normal file
6
Lib/test/typinganndata/fwdref_module.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from typing import ForwardRef
|
||||||
|
|
||||||
|
MyList = list[int]
|
||||||
|
MyDict = dict[str, 'MyList']
|
||||||
|
|
||||||
|
fw = ForwardRef('MyDict', module=__name__)
|
|
@ -430,7 +430,7 @@ _sentinel = _Sentinel()
|
||||||
|
|
||||||
|
|
||||||
def _eval_type(t, globalns, localns, type_params=_sentinel, *, recursive_guard=frozenset(),
|
def _eval_type(t, globalns, localns, type_params=_sentinel, *, recursive_guard=frozenset(),
|
||||||
format=None, owner=None):
|
format=None, owner=None, parent_fwdref=None):
|
||||||
"""Evaluate all forward references in the given type t.
|
"""Evaluate all forward references in the given type t.
|
||||||
|
|
||||||
For use of globalns and localns see the docstring for get_type_hints().
|
For use of globalns and localns see the docstring for get_type_hints().
|
||||||
|
@ -451,7 +451,7 @@ def _eval_type(t, globalns, localns, type_params=_sentinel, *, recursive_guard=f
|
||||||
if isinstance(t, (_GenericAlias, GenericAlias, Union)):
|
if isinstance(t, (_GenericAlias, GenericAlias, Union)):
|
||||||
if isinstance(t, GenericAlias):
|
if isinstance(t, GenericAlias):
|
||||||
args = tuple(
|
args = tuple(
|
||||||
_make_forward_ref(arg) if isinstance(arg, str) else arg
|
_make_forward_ref(arg, parent_fwdref=parent_fwdref) if isinstance(arg, str) else arg
|
||||||
for arg in t.__args__
|
for arg in t.__args__
|
||||||
)
|
)
|
||||||
is_unpacked = t.__unpacked__
|
is_unpacked = t.__unpacked__
|
||||||
|
@ -936,7 +936,12 @@ def TypeIs(self, parameters):
|
||||||
return _GenericAlias(self, (item,))
|
return _GenericAlias(self, (item,))
|
||||||
|
|
||||||
|
|
||||||
def _make_forward_ref(code, **kwargs):
|
def _make_forward_ref(code, *, parent_fwdref=None, **kwargs):
|
||||||
|
if parent_fwdref is not None:
|
||||||
|
if parent_fwdref.__forward_module__ is not None:
|
||||||
|
kwargs['module'] = parent_fwdref.__forward_module__
|
||||||
|
if parent_fwdref.__owner__ is not None:
|
||||||
|
kwargs['owner'] = parent_fwdref.__owner__
|
||||||
forward_ref = _lazy_annotationlib.ForwardRef(code, **kwargs)
|
forward_ref = _lazy_annotationlib.ForwardRef(code, **kwargs)
|
||||||
# For compatibility, eagerly compile the forwardref's code.
|
# For compatibility, eagerly compile the forwardref's code.
|
||||||
forward_ref.__forward_code__
|
forward_ref.__forward_code__
|
||||||
|
@ -1001,6 +1006,7 @@ def evaluate_forward_ref(
|
||||||
recursive_guard=_recursive_guard | {forward_ref.__forward_arg__},
|
recursive_guard=_recursive_guard | {forward_ref.__forward_arg__},
|
||||||
format=format,
|
format=format,
|
||||||
owner=owner,
|
owner=owner,
|
||||||
|
parent_fwdref=forward_ref,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Improve support for evaluating nested forward references in
|
||||||
|
:func:`typing.evaluate_forward_ref`.
|
Loading…
Add table
Add a link
Reference in a new issue