We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
2 parents 9f40b65 + a53b5b1 commit 2fe43b0Copy full SHA for 2fe43b0
3 files changed
Lib/test/test_typing.py
@@ -2801,8 +2801,14 @@ def test_args(self):
2801
self.assertEqual(Literal[1, 2, 3].__args__, (1, 2, 3))
2802
self.assertEqual(Literal[1, 2, 3, 3].__args__, (1, 2, 3))
2803
self.assertEqual(Literal[1, Literal[2], Literal[3, 4]].__args__, (1, 2, 3, 4))
2804
- # Mutable arguments will not be deduplicated
2805
- self.assertEqual(Literal[[], []].__args__, ([], []))
+ # Unhashable arguments will be deduplicated too
+ self.assertEqual(Literal[[], []].__args__, ([],))
2806
+ self.assertEqual(Literal[{"a": 1}, {"a": 1}].__args__, ({"a": 1},))
2807
+ self.assertEqual(
2808
+ Literal[1, {'a': 'b'}, 2, {'a': 'b'}, 3].__args__,
2809
+ (1, {'a': 'b'}, 2, 3),
2810
+ )
2811
+ self.assertEqual(Literal[{1}, {1}, {2}, {2}].__args__, ({1}, {2}))
2812
2813
def test_flatten(self):
2814
l1 = Literal[Literal[1], Literal[2], Literal[3]]
Lib/typing.py
@@ -775,13 +775,16 @@ def open_helper(file: str, mode: MODE) -> str:
775
# There is no '_type_check' call because arguments to Literal[...] are
776
# values, not types.
777
parameters = _flatten_literal_params(parameters)
778
+ value_and_type_parameters = list(_value_and_type_iter(parameters))
779
+ deduplicated_parameters = tuple(
780
+ p
781
+ for p, _ in _deduplicate(
782
+ value_and_type_parameters,
783
+ unhashable_fallback=True,
784
785
786
- try:
- parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
- except TypeError: # unhashable parameters
- pass
-
- return _LiteralGenericAlias(self, parameters)
787
+ return _LiteralGenericAlias(self, deduplicated_parameters)
788
789
790
@_SpecialForm
Misc/NEWS.d/next/Library/2026-07-18-10-52-10.gh-issue-153896.87oevp.rst
@@ -0,0 +1 @@
1
+Deduplicate unhashable args in :data:`typing.Literal`.
0 commit comments