mirror of
https://github.com/python/cpython.git
synced 2025-07-07 11:25:30 +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')],
|
||||
)
|
||||
|
||||
def test_with_module(self):
|
||||
from test.typinganndata import fwdref_module
|
||||
|
||||
typing.evaluate_forward_ref(
|
||||
fwdref_module.fw,)
|
||||
|
||||
|
||||
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(),
|
||||
format=None, owner=None):
|
||||
format=None, owner=None, parent_fwdref=None):
|
||||
"""Evaluate all forward references in the given type t.
|
||||
|
||||
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):
|
||||
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__
|
||||
)
|
||||
else:
|
||||
|
@ -936,7 +936,12 @@ def TypeIs(self, parameters):
|
|||
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)
|
||||
# For compatibility, eagerly compile the forwardref's code.
|
||||
forward_ref.__forward_code__
|
||||
|
@ -1001,6 +1006,7 @@ def evaluate_forward_ref(
|
|||
recursive_guard=_recursive_guard | {forward_ref.__forward_arg__},
|
||||
format=format,
|
||||
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