mirror of https://github.com/python/cpython
bpo-45679: Fix caching of multi-value typing.Literal (GH-29334)
Literal[True, 2] is no longer equal to Literal[1, 2].
This commit is contained in:
parent
aad48062ef
commit
634984d7db
|
@ -714,6 +714,8 @@ class LiteralTests(BaseTestCase):
|
|||
self.assertNotEqual(Literal[True], Literal[1])
|
||||
self.assertNotEqual(Literal[1], Literal[2])
|
||||
self.assertNotEqual(Literal[1, True], Literal[1])
|
||||
self.assertNotEqual(Literal[1, True], Literal[1, 1])
|
||||
self.assertNotEqual(Literal[1, 2], Literal[True, 2])
|
||||
self.assertEqual(Literal[1], Literal[1])
|
||||
self.assertEqual(Literal[1, 2], Literal[2, 1])
|
||||
self.assertEqual(Literal[1, 2, 3], Literal[1, 2, 3, 3])
|
||||
|
@ -4963,6 +4965,8 @@ class SpecialAttrsTests(BaseTestCase):
|
|||
typing.Concatenate[Any, SpecialAttrsP]: 'Concatenate',
|
||||
typing.Final[Any]: 'Final',
|
||||
typing.Literal[Any]: 'Literal',
|
||||
typing.Literal[1, 2]: 'Literal',
|
||||
typing.Literal[True, 2]: 'Literal',
|
||||
typing.Optional[Any]: 'Optional',
|
||||
typing.TypeGuard[Any]: 'TypeGuard',
|
||||
typing.Union[Any]: 'Any',
|
||||
|
|
|
@ -411,9 +411,10 @@ class _SpecialForm(_Final, _root=True):
|
|||
|
||||
|
||||
class _LiteralSpecialForm(_SpecialForm, _root=True):
|
||||
@_tp_cache(typed=True)
|
||||
def __getitem__(self, parameters):
|
||||
return self._getitem(self, parameters)
|
||||
if not isinstance(parameters, tuple):
|
||||
parameters = (parameters,)
|
||||
return self._getitem(self, *parameters)
|
||||
|
||||
|
||||
@_SpecialForm
|
||||
|
@ -536,7 +537,8 @@ def Optional(self, parameters):
|
|||
return Union[arg, type(None)]
|
||||
|
||||
@_LiteralSpecialForm
|
||||
def Literal(self, parameters):
|
||||
@_tp_cache(typed=True)
|
||||
def Literal(self, *parameters):
|
||||
"""Special typing form to define literal types (a.k.a. value types).
|
||||
|
||||
This form can be used to indicate to type checkers that the corresponding
|
||||
|
@ -559,9 +561,6 @@ def Literal(self, parameters):
|
|||
"""
|
||||
# There is no '_type_check' call because arguments to Literal[...] are
|
||||
# values, not types.
|
||||
if not isinstance(parameters, tuple):
|
||||
parameters = (parameters,)
|
||||
|
||||
parameters = _flatten_literal_params(parameters)
|
||||
|
||||
try:
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix caching of multi-value :data:`typing.Literal`. ``Literal[True, 2]`` is no
|
||||
longer equal to ``Literal[1, 2]``.
|
Loading…
Reference in New Issue