From 7d8a65ae423bafbbe1316e4ff5d3c2bb9a10fad7 Mon Sep 17 00:00:00 2001 From: Henry Su Date: Sat, 25 Jul 2026 20:47:05 -0500 Subject: [PATCH] Fix dict[None, T] key conversion --- CHANGELOG.md | 2 ++ temporalio/converter/_payload_converter.py | 6 ++++-- tests/test_converter.py | 5 +---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6230f2754..7feb83061 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,8 @@ to include examples, links to docs, or any other relevant information. ### Fixed +- Fixed JSON conversion of `dict[None, T]` type hints to restore `None` keys. + ### Security ## [1.30.0] - 2026-07-01 diff --git a/temporalio/converter/_payload_converter.py b/temporalio/converter/_payload_converter.py index f10b6a4e0..d6f90d38e 100644 --- a/temporalio/converter/_payload_converter.py +++ b/temporalio/converter/_payload_converter.py @@ -916,8 +916,10 @@ def value_to_type( origin, "__optional_keys__", None ): per_key_types = get_type_hints(origin) - key_type = ( - type_args[0] + key_type: Any = ( + type(None) + if len(type_args) > 0 and type_args[0] is None + else type_args[0] if len(type_args) > 0 and type_args[0] is not Any and not isinstance(type_args[0], TypeVar) diff --git a/tests/test_converter.py b/tests/test_converter.py index b5e10c518..85e597e0c 100644 --- a/tests/test_converter.py +++ b/tests/test_converter.py @@ -552,10 +552,7 @@ def fail(hint: Any, value: Any) -> None: ok(dict[float, str], {1.0: "1"}) ok(dict[bool, str], {True: "1"}) - # On a 3.10+ dict type, None isn't returned from a key. This is potentially a bug - ok(dict[None, str], {"null": "1"}) - - # Dict has a different value for None keys + ok(dict[None, str], {None: "1"}) ok(Dict[None, str], {None: "1"}) # type:ignore[reportDeprecated] # Alias