diff options
author | Bas van Beek <43369155+BvB93@users.noreply.github.com> | 2021-08-06 13:36:35 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-06 13:36:35 (GMT) |
commit | 8bdf12e99a3dc7ada5f85bba79c2a9eb9931f5b0 (patch) | |
tree | 8f9abe8a0553936e1978be3d297d8479f80d9caf /Lib/typing.py | |
parent | c24896c0e3b32c8a9f614ef51366007b67d5c665 (diff) | |
download | cpython-8bdf12e99a3dc7ada5f85bba79c2a9eb9931f5b0.zip cpython-8bdf12e99a3dc7ada5f85bba79c2a9eb9931f5b0.tar.gz cpython-8bdf12e99a3dc7ada5f85bba79c2a9eb9931f5b0.tar.bz2 |
bpo-44524: Fix an issue wherein `_GenericAlias._name` was not properly set for specialforms (GH-27614)
Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Co-authored-by: Ćukasz Langa <lukasz@langa.pl>
Diffstat (limited to 'Lib/typing.py')
-rw-r--r-- | Lib/typing.py | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index 9c595ae..51468ae 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -461,7 +461,7 @@ def ClassVar(self, parameters): be used with isinstance() or issubclass(). """ item = _type_check(parameters, f'{self} accepts only single type.') - return _GenericAlias(self, (item,)) + return _GenericAlias(self, (item,), name="ClassVar") @_SpecialForm def Final(self, parameters): @@ -482,7 +482,7 @@ def Final(self, parameters): There is no runtime checking of these properties. """ item = _type_check(parameters, f'{self} accepts only single type.') - return _GenericAlias(self, (item,)) + return _GenericAlias(self, (item,), name="Final") @_SpecialForm def Union(self, parameters): @@ -520,7 +520,12 @@ def Union(self, parameters): parameters = _remove_dups_flatten(parameters) if len(parameters) == 1: return parameters[0] - return _UnionGenericAlias(self, parameters) + + if len(parameters) == 2 and type(None) in parameters: + name = "Optional" + else: + name = "Union" + return _UnionGenericAlias(self, parameters, name=name) @_SpecialForm def Optional(self, parameters): @@ -565,7 +570,7 @@ def Literal(self, parameters): except TypeError: # unhashable parameters pass - return _LiteralGenericAlias(self, parameters) + return _LiteralGenericAlias(self, parameters, name="Literal") @_SpecialForm @@ -604,7 +609,7 @@ def Concatenate(self, parameters): "ParamSpec variable.") msg = "Concatenate[arg, ...]: each arg must be a type." parameters = tuple(_type_check(p, msg) for p in parameters) - return _ConcatenateGenericAlias(self, parameters) + return _ConcatenateGenericAlias(self, parameters, name="Concatenate") @_SpecialForm @@ -652,7 +657,7 @@ def TypeGuard(self, parameters): PEP 647 (User-Defined Type Guards). """ item = _type_check(parameters, f'{self} accepts only single type.') - return _GenericAlias(self, (item,)) + return _GenericAlias(self, (item,), name="TypeGuard") class ForwardRef(_Final, _root=True): @@ -1237,6 +1242,10 @@ class _UnionGenericAlias(_GenericAlias, _root=True): if issubclass(cls, arg): return True + def __reduce__(self): + func, (origin, args) = super().__reduce__() + return func, (Union, args) + def _value_and_type_iter(parameters): return ((p, type(p)) for p in parameters) @@ -1566,7 +1575,7 @@ class _AnnotatedAlias(_GenericAlias, _root=True): if isinstance(origin, _AnnotatedAlias): metadata = origin.__metadata__ + metadata origin = origin.__origin__ - super().__init__(origin, origin) + super().__init__(origin, origin, name="Annotated") self.__metadata__ = metadata def copy_with(self, params): |