aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/typing.py
diff options
context:
space:
mode:
authorBatuhan Taskaya <batuhanosmantaskaya@gmail.com>2020-10-06 23:03:02 +0300
committerGitHub <noreply@github.com>2020-10-06 13:03:02 -0700
commit044a1048ca93d466965afc027b91a5a9eb9ce23c (patch)
tree94ef2bca072693d83448edef4009dc840c58a3e2 /Lib/typing.py
parentbef7d299eb911086ea5a7ccf7a9da337e38a8491 (diff)
downloadcpython-044a1048ca93d466965afc027b91a5a9eb9ce23c.tar.gz
cpython-044a1048ca93d466965afc027b91a5a9eb9ce23c.zip
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).
Diffstat (limited to 'Lib/typing.py')
-rw-r--r--Lib/typing.py8
1 files changed, 8 insertions, 0 deletions
diff --git a/Lib/typing.py b/Lib/typing.py
index 8c61bd8e084..4cf33c1ae92 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -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: