Skip to content

Commit d3daef1

Browse files
Merge branch '3.14' into backport-1f13740-3.14
2 parents 40dfcc1 + 6f198d2 commit d3daef1

4 files changed

Lines changed: 20 additions & 8 deletions

File tree

Lib/test/test_typing.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2739,8 +2739,14 @@ def test_args(self):
27392739
self.assertEqual(Literal[1, 2, 3].__args__, (1, 2, 3))
27402740
self.assertEqual(Literal[1, 2, 3, 3].__args__, (1, 2, 3))
27412741
self.assertEqual(Literal[1, Literal[2], Literal[3, 4]].__args__, (1, 2, 3, 4))
2742-
# Mutable arguments will not be deduplicated
2743-
self.assertEqual(Literal[[], []].__args__, ([], []))
2742+
# Unhashable arguments will be deduplicated too
2743+
self.assertEqual(Literal[[], []].__args__, ([],))
2744+
self.assertEqual(Literal[{"a": 1}, {"a": 1}].__args__, ({"a": 1},))
2745+
self.assertEqual(
2746+
Literal[1, {'a': 'b'}, 2, {'a': 'b'}, 3].__args__,
2747+
(1, {'a': 'b'}, 2, 3),
2748+
)
2749+
self.assertEqual(Literal[{1}, {1}, {2}, {2}].__args__, ({1}, {2}))
27442750

27452751
def test_flatten(self):
27462752
l1 = Literal[Literal[1], Literal[2], Literal[3]]

Lib/typing.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -772,13 +772,16 @@ def open_helper(file: str, mode: MODE) -> str:
772772
# There is no '_type_check' call because arguments to Literal[...] are
773773
# values, not types.
774774
parameters = _flatten_literal_params(parameters)
775+
value_and_type_parameters = list(_value_and_type_iter(parameters))
776+
deduplicated_parameters = tuple(
777+
p
778+
for p, _ in _deduplicate(
779+
value_and_type_parameters,
780+
unhashable_fallback=True,
781+
)
782+
)
775783

776-
try:
777-
parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
778-
except TypeError: # unhashable parameters
779-
pass
780-
781-
return _LiteralGenericAlias(self, parameters)
784+
return _LiteralGenericAlias(self, deduplicated_parameters)
782785

783786

784787
@_SpecialForm
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Deduplicate unhashable args in :data:`typing.Literal`.

Tools/check-c-api-docs/ignored_c_api.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,5 @@ PyUnicode_AsDecodedObject
102102
PyUnicode_AsDecodedUnicode
103103
PyUnicode_AsEncodedObject
104104
PyUnicode_AsEncodedUnicode
105+
# Soft-deprecated in 3.15; will remain undocumented in 3.14 and 3.13
106+
PyException_HEAD

0 commit comments

Comments
 (0)