Skip to content

Commit 634984d

Browse files
bpo-45679: Fix caching of multi-value typing.Literal (GH-29334)
Literal[True, 2] is no longer equal to Literal[1, 2].
1 parent aad4806 commit 634984d

File tree

3 files changed

+11
-6
lines changed

3 files changed

+11
-6
lines changed

Lib/test/test_typing.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,8 @@ def test_equal(self):
714714
self.assertNotEqual(Literal[True], Literal[1])
715715
self.assertNotEqual(Literal[1], Literal[2])
716716
self.assertNotEqual(Literal[1, True], Literal[1])
717+
self.assertNotEqual(Literal[1, True], Literal[1, 1])
718+
self.assertNotEqual(Literal[1, 2], Literal[True, 2])
717719
self.assertEqual(Literal[1], Literal[1])
718720
self.assertEqual(Literal[1, 2], Literal[2, 1])
719721
self.assertEqual(Literal[1, 2, 3], Literal[1, 2, 3, 3])
@@ -4963,6 +4965,8 @@ def test_special_attrs(self):
49634965
typing.Concatenate[Any, SpecialAttrsP]: 'Concatenate',
49644966
typing.Final[Any]: 'Final',
49654967
typing.Literal[Any]: 'Literal',
4968+
typing.Literal[1, 2]: 'Literal',
4969+
typing.Literal[True, 2]: 'Literal',
49664970
typing.Optional[Any]: 'Optional',
49674971
typing.TypeGuard[Any]: 'TypeGuard',
49684972
typing.Union[Any]: 'Any',

Lib/typing.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,10 @@ def __getitem__(self, parameters):
411411

412412

413413
class _LiteralSpecialForm(_SpecialForm, _root=True):
414-
@_tp_cache(typed=True)
415414
def __getitem__(self, parameters):
416-
return self._getitem(self, parameters)
415+
if not isinstance(parameters, tuple):
416+
parameters = (parameters,)
417+
return self._getitem(self, *parameters)
417418

418419

419420
@_SpecialForm
@@ -536,7 +537,8 @@ def Optional(self, parameters):
536537
return Union[arg, type(None)]
537538

538539
@_LiteralSpecialForm
539-
def Literal(self, parameters):
540+
@_tp_cache(typed=True)
541+
def Literal(self, *parameters):
540542
"""Special typing form to define literal types (a.k.a. value types).
541543
542544
This form can be used to indicate to type checkers that the corresponding
@@ -559,9 +561,6 @@ def open_helper(file: str, mode: MODE) -> str:
559561
"""
560562
# There is no '_type_check' call because arguments to Literal[...] are
561563
# values, not types.
562-
if not isinstance(parameters, tuple):
563-
parameters = (parameters,)
564-
565564
parameters = _flatten_literal_params(parameters)
566565

567566
try:
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix caching of multi-value :data:`typing.Literal`. ``Literal[True, 2]`` is no
2+
longer equal to ``Literal[1, 2]``.

0 commit comments

Comments
 (0)