From e6bedb13b0d04ad763e1bca7ee9f171ea3e4fc24 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Tue, 30 Dec 2025 10:38:39 +0000 Subject: [PATCH] Handle Annotated types in _serialize_python_type for TypedDict generation --- src/datamodel_code_generator/__main__.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/datamodel_code_generator/__main__.py b/src/datamodel_code_generator/__main__.py index 06d08e600..43fe4028f 100644 --- a/src/datamodel_code_generator/__main__.py +++ b/src/datamodel_code_generator/__main__.py @@ -856,7 +856,7 @@ def _get_preserved_type_origins() -> dict[type, str]: return _PRESERVED_TYPE_ORIGINS -def _serialize_python_type(tp: type) -> str | None: +def _serialize_python_type(tp: type) -> str | None: # noqa: PLR0911 """Serialize Python type to a string for x-python-type field. Returns None if the type doesn't need to be preserved (e.g., standard dict, list). @@ -884,6 +884,14 @@ def _serialize_python_type(tp: type) -> str | None: return " | ".join(n or _simple_type_name(a) for n, a in zip(nested, args, strict=False)) return None # pragma: no cover + # Handle Annotated types - extract the base type and ignore metadata + from typing import Annotated # noqa: PLC0415 + + if origin is Annotated: + if args: + return _serialize_python_type(args[0]) or _simple_type_name(args[0]) + return None # pragma: no cover + type_name: str | None = None if origin is not None: type_name = preserved_origins.get(origin)