bpo-44524: Fix an issue wherein `_GenericAlias._name` was not properl… · python/cpython@8bdf12e · GitHub
Skip to content

Commit 8bdf12e

Browse files
BvB93Fidget-Spinnerambv
authored
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>
1 parent c24896c commit 8bdf12e

3 files changed

Lines changed: 191 additions & 61 deletions

File tree

Lib/test/test_typing.py

Lines changed: 173 additions & 54 deletions

Lib/typing.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ class Starship:
461461
be used with isinstance() or issubclass().
462462
"""
463463
item = _type_check(parameters, f'{self} accepts only single type.')
464-
return _GenericAlias(self, (item,))
464+
return _GenericAlias(self, (item,), name="ClassVar")
465465

466466
@_SpecialForm
467467
def Final(self, parameters):
@@ -482,7 +482,7 @@ class FastConnector(Connection):
482482
There is no runtime checking of these properties.
483483
"""
484484
item = _type_check(parameters, f'{self} accepts only single type.')
485-
return _GenericAlias(self, (item,))
485+
return _GenericAlias(self, (item,), name="Final")
486486

487487
@_SpecialForm
488488
def Union(self, parameters):
@@ -520,7 +520,12 @@ def Union(self, parameters):
520520
parameters = _remove_dups_flatten(parameters)
521521
if len(parameters) == 1:
522522
return parameters[0]
523-
return _UnionGenericAlias(self, parameters)
523+
524+
if len(parameters) == 2 and type(None) in parameters:
525+
name = "Optional"
526+
else:
527+
name = "Union"
528+
return _UnionGenericAlias(self, parameters, name=name)
524529

525530
@_SpecialForm
526531
def Optional(self, parameters):
@@ -565,7 +570,7 @@ def open_helper(file: str, mode: MODE) -> str:
565570
except TypeError: # unhashable parameters
566571
pass
567572

568-
return _LiteralGenericAlias(self, parameters)
573+
return _LiteralGenericAlias(self, parameters, name="Literal")
569574

570575

571576
@_SpecialForm
@@ -604,7 +609,7 @@ def Concatenate(self, parameters):
604609
"ParamSpec variable.")
605610
msg = "Concatenate[arg, ...]: each arg must be a type."
606611
parameters = tuple(_type_check(p, msg) for p in parameters)
607-
return _ConcatenateGenericAlias(self, parameters)
612+
return _ConcatenateGenericAlias(self, parameters, name="Concatenate")
608613

609614

610615
@_SpecialForm
@@ -652,7 +657,7 @@ def is_str(val: Union[str, float]):
652657
PEP 647 (User-Defined Type Guards).
653658
"""
654659
item = _type_check(parameters, f'{self} accepts only single type.')
655-
return _GenericAlias(self, (item,))
660+
return _GenericAlias(self, (item,), name="TypeGuard")
656661

657662

658663
class ForwardRef(_Final, _root=True):
@@ -1237,6 +1242,10 @@ def __subclasscheck__(self, cls):
12371242
if issubclass(cls, arg):
12381243
return True
12391244

1245+
def __reduce__(self):
1246+
func, (origin, args) = super().__reduce__()
1247+
return func, (Union, args)
1248+
12401249

12411250
def _value_and_type_iter(parameters):
12421251
return ((p, type(p)) for p in parameters)
@@ -1566,7 +1575,7 @@ def __init__(self, origin, metadata):
15661575
if isinstance(origin, _AnnotatedAlias):
15671576
metadata = origin.__metadata__ + metadata
15681577
origin = origin.__origin__
1569-
super().__init__(origin, origin)
1578+
super().__init__(origin, origin, name="Annotated")
15701579
self.__metadata__ = metadata
15711580

15721581
def copy_with(self, params):
Lines changed: 2 additions & 0 deletions

0 commit comments

Comments
 (0)