mirror of
https://github.com/python/cpython.git
synced 2025-08-24 10:45:53 +00:00
bpo-38605: Make 'from __future__ import annotations' the default (GH-20434)
The hard part was making all the tests pass; there are some subtle issues here, because apparently the future import wasn't tested very thoroughly in previous Python versions. For example, `inspect.signature()` returned type objects normally (except for forward references), but strings with the future import. We changed it to try and return type objects by calling `typing.get_type_hints()`, but fall back on returning strings if that function fails (which it may do if there are future references in the annotations that require passing in a specific namespace to resolve).
This commit is contained in:
parent
bef7d299eb
commit
044a1048ca
27 changed files with 403 additions and 299 deletions
|
@ -18,6 +18,7 @@ At large scale, the structure of the module is following:
|
|||
"""
|
||||
|
||||
from abc import abstractmethod, ABCMeta
|
||||
import ast
|
||||
import collections
|
||||
import collections.abc
|
||||
import contextlib
|
||||
|
@ -469,6 +470,13 @@ class ForwardRef(_Final, _root=True):
|
|||
def __init__(self, arg, is_argument=True):
|
||||
if not isinstance(arg, str):
|
||||
raise TypeError(f"Forward reference must be a string -- got {arg!r}")
|
||||
|
||||
# Double-stringified forward references is a result of activating
|
||||
# the 'annotations' future by default. This way, we eliminate them in
|
||||
# the runtime.
|
||||
if arg.startswith(("'", '\"')) and arg.endswith(("'", '"')):
|
||||
arg = arg[1:-1]
|
||||
|
||||
try:
|
||||
code = compile(arg, '<string>', 'eval')
|
||||
except SyntaxError:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue