Skip to content

Commit bbcf06b

Browse files
[3.9] bpo-45679: Fix caching of multi-value typing.Literal (GH-29334) (GH-29342)
Literal[True, 2] is no longer equal to Literal[1, 2].. (cherry picked from commit 634984d) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 5f527ca commit bbcf06b

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

Lib/test/test_typing.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,8 @@ def test_equal(self):
562562
self.assertNotEqual(Literal[True], Literal[1])
563563
self.assertNotEqual(Literal[1], Literal[2])
564564
self.assertNotEqual(Literal[1, True], Literal[1])
565+
self.assertNotEqual(Literal[1, True], Literal[1, 1])
566+
self.assertNotEqual(Literal[1, 2], Literal[True, 2])
565567
self.assertEqual(Literal[1], Literal[1])
566568
self.assertEqual(Literal[1, 2], Literal[2, 1])
567569
self.assertEqual(Literal[1, 2, 3], Literal[1, 2, 3, 3])

Lib/typing.py

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

356356

357357
class _LiteralSpecialForm(_SpecialForm, _root=True):
358-
@_tp_cache(typed=True)
359358
def __getitem__(self, parameters):
360-
return self._getitem(self, parameters)
359+
if not isinstance(parameters, tuple):
360+
parameters = (parameters,)
361+
return self._getitem(self, *parameters)
361362

362363

363364
@_SpecialForm
@@ -478,7 +479,8 @@ def Optional(self, parameters):
478479
return Union[arg, type(None)]
479480

480481
@_LiteralSpecialForm
481-
def Literal(self, parameters):
482+
@_tp_cache(typed=True)
483+
def Literal(self, *parameters):
482484
"""Special typing form to define literal types (a.k.a. value types).
483485
484486
This form can be used to indicate to type checkers that the corresponding
@@ -501,9 +503,6 @@ def open_helper(file: str, mode: MODE) -> str:
501503
"""
502504
# There is no '_type_check' call because arguments to Literal[...] are
503505
# values, not types.
504-
if not isinstance(parameters, tuple):
505-
parameters = (parameters,)
506-
507506
parameters = _flatten_literal_params(parameters)
508507

509508
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)