mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-136316: Make typing.evaluate_forward_ref better at evaluating nested forwardrefs (#136319)
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 / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Change detection (push) Waiting to run
Tests / Docs (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 / Address sanitizer (push) Blocked by required conditions
Tests / Undefined behavior sanitizer (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
mypy / Run mypy on Lib/_pyrepl (push) Waiting to run
mypy / Run mypy on Lib/test/libregrtest (push) Waiting to run
mypy / Run mypy on Lib/tomllib (push) Waiting to run
mypy / Run mypy on Tools/build (push) Waiting to run
mypy / Run mypy on Tools/cases_generator (push) Waiting to run
mypy / Run mypy on Tools/clinic (push) Waiting to run
mypy / Run mypy on Tools/jit (push) Waiting to run
mypy / Run mypy on Tools/peg_generator (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 / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Change detection (push) Waiting to run
Tests / Docs (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 / Address sanitizer (push) Blocked by required conditions
Tests / Undefined behavior sanitizer (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
mypy / Run mypy on Lib/_pyrepl (push) Waiting to run
mypy / Run mypy on Lib/test/libregrtest (push) Waiting to run
mypy / Run mypy on Lib/tomllib (push) Waiting to run
mypy / Run mypy on Tools/build (push) Waiting to run
mypy / Run mypy on Tools/cases_generator (push) Waiting to run
mypy / Run mypy on Tools/clinic (push) Waiting to run
mypy / Run mypy on Tools/jit (push) Waiting to run
mypy / Run mypy on Tools/peg_generator (push) Waiting to run
This commit is contained in:
parent
c89f76e6c4
commit
9312702d2e
4 changed files with 23 additions and 3 deletions
|
@ -7326,6 +7326,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__)
|
|
@ -438,7 +438,7 @@ class _Sentinel:
|
||||||
|
|
||||||
|
|
||||||
def _eval_type(t, globalns, localns, type_params, *, recursive_guard=frozenset(),
|
def _eval_type(t, globalns, localns, type_params, *, 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().
|
||||||
|
@ -456,7 +456,7 @@ def _eval_type(t, globalns, localns, type_params, *, recursive_guard=frozenset()
|
||||||
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__
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
@ -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