summaryrefslogtreecommitdiffstats
path: root/Lib/typing.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2020-04-07 16:50:06 (GMT)
committerGitHub <noreply@github.com>2020-04-07 16:50:06 (GMT)
commit48b069a003ba6c684a9ba78493fbbec5e89f10b8 (patch)
treee67e71abd17516cea5fe1a1ec487bf929ab0b9fd /Lib/typing.py
parent9cc3ebd7e04cb645ac7b2f372eaafa7464e16b9c (diff)
downloadcpython-48b069a003ba6c684a9ba78493fbbec5e89f10b8.zip
cpython-48b069a003ba6c684a9ba78493fbbec5e89f10b8.tar.gz
cpython-48b069a003ba6c684a9ba78493fbbec5e89f10b8.tar.bz2
bpo-39481: Implementation for PEP 585 (#18239)
This implements things like `list[int]`, which returns an object of type `types.GenericAlias`. This object mostly acts as a proxy for `list`, but has attributes `__origin__` and `__args__` that allow recovering the parts (with values `list` and `(int,)`. There is also an approximate notion of type variables; e.g. `list[T]` has a `__parameters__` attribute equal to `(T,)`. Type variables are objects of type `typing.TypeVar`.
Diffstat (limited to 'Lib/typing.py')
-rw-r--r--Lib/typing.py7
1 files changed, 4 insertions, 3 deletions
diff --git a/Lib/typing.py b/Lib/typing.py
index a72003a..6cc3b03 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -26,7 +26,7 @@ import operator
import re as stdlib_re # Avoid confusion with the re we export.
import sys
import types
-from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType
+from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias
# Please keep __all__ alphabetized within each category.
__all__ = [
@@ -180,7 +180,8 @@ def _collect_type_vars(types):
for t in types:
if isinstance(t, TypeVar) and t not in tvars:
tvars.append(t)
- if isinstance(t, _GenericAlias) and not t._special:
+ if ((isinstance(t, _GenericAlias) and not t._special)
+ or isinstance(t, GenericAlias)):
tvars.extend([t for t in t.__parameters__ if t not in tvars])
return tuple(tvars)
@@ -947,7 +948,7 @@ _TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
'__init__', '__module__', '__new__', '__slots__',
- '__subclasshook__', '__weakref__']
+ '__subclasshook__', '__weakref__', '__class_getitem__']
# These special attributes will be not collected as protocol members.
EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']