summaryrefslogtreecommitdiffstats
path: root/Lib/typing.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2020-04-26 18:21:08 (GMT)
committerGitHub <noreply@github.com>2020-04-26 18:21:08 (GMT)
commit68b352a6982f51e19bf9b9f4ae61b34f5864d131 (patch)
tree1661b64e9af3c687d6710f65488cd2d0e691ada9 /Lib/typing.py
parentcfaf4c09ab959a9e6d8fc446ba7595f132d770ac (diff)
downloadcpython-68b352a6982f51e19bf9b9f4ae61b34f5864d131.zip
cpython-68b352a6982f51e19bf9b9f4ae61b34f5864d131.tar.gz
cpython-68b352a6982f51e19bf9b9f4ae61b34f5864d131.tar.bz2
bpo-40396: Support GenericAlias in the typing functions. (GH-19718)
Diffstat (limited to 'Lib/typing.py')
-rw-r--r--Lib/typing.py23
1 files changed, 18 insertions, 5 deletions
diff --git a/Lib/typing.py b/Lib/typing.py
index 1b13aed..1aefcb8 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -191,7 +191,7 @@ def _subs_tvars(tp, tvars, subs):
"""Substitute type variables 'tvars' with substitutions 'subs'.
These two must have the same length.
"""
- if not isinstance(tp, _GenericAlias):
+ if not isinstance(tp, (_GenericAlias, GenericAlias)):
return tp
new_args = list(tp.__args__)
for a, arg in enumerate(tp.__args__):
@@ -203,7 +203,10 @@ def _subs_tvars(tp, tvars, subs):
new_args[a] = _subs_tvars(arg, tvars, subs)
if tp.__origin__ is Union:
return Union[tuple(new_args)]
- return tp.copy_with(tuple(new_args))
+ if isinstance(tp, GenericAlias):
+ return GenericAlias(tp.__origin__, tuple(new_args))
+ else:
+ return tp.copy_with(tuple(new_args))
def _check_generic(cls, parameters):
@@ -278,6 +281,11 @@ def _eval_type(t, globalns, localns):
res = t.copy_with(ev_args)
res._special = t._special
return res
+ if isinstance(t, GenericAlias):
+ ev_args = tuple(_eval_type(a, globalns, localns) for a in t.__args__)
+ if ev_args == t.__args__:
+ return t
+ return GenericAlias(t.__origin__, ev_args)
return t
@@ -1368,6 +1376,11 @@ def _strip_annotations(t):
res = t.copy_with(stripped_args)
res._special = t._special
return res
+ if isinstance(t, GenericAlias):
+ stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
+ if stripped_args == t.__args__:
+ return t
+ return GenericAlias(t.__origin__, stripped_args)
return t
@@ -1387,7 +1400,7 @@ def get_origin(tp):
"""
if isinstance(tp, _AnnotatedAlias):
return Annotated
- if isinstance(tp, _GenericAlias):
+ if isinstance(tp, (_GenericAlias, GenericAlias)):
return tp.__origin__
if tp is Generic:
return Generic
@@ -1407,9 +1420,9 @@ def get_args(tp):
"""
if isinstance(tp, _AnnotatedAlias):
return (tp.__origin__,) + tp.__metadata__
- if isinstance(tp, _GenericAlias):
+ if isinstance(tp, (_GenericAlias, GenericAlias)):
res = tp.__args__
- if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis:
+ if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis:
res = (list(res[:-1]), res[-1])
return res
return ()