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>
(cherry picked from commit 8bdf12e99a3dc7ada5f85bba79c2a9eb9931f5b0)
Co-authored-by: Bas van Beek <43369155+BvB93@users.noreply.github.com>
diff --git a/Lib/typing.py b/Lib/typing.py
index 3cbc8a4..6d7ba33 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -453,7 +453,7 @@ class Starship:
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):
@@ -474,7 +474,7 @@ class FastConnector(Connection):
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):
@@ -512,7 +512,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):
@@ -557,7 +562,7 @@ def open_helper(file: str, mode: MODE) -> str:
except TypeError: # unhashable parameters
pass
- return _LiteralGenericAlias(self, parameters)
+ return _LiteralGenericAlias(self, parameters, name="Literal")
@_SpecialForm
@@ -596,7 +601,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
@@ -644,7 +649,7 @@ def is_str(val: Union[str, float]):
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):
@@ -1235,6 +1240,10 @@ def __subclasscheck__(self, cls):
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)
@@ -1567,7 +1576,7 @@ def __init__(self, origin, metadata):
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):