From f5796cb8dbb4635e9bb460c871f83abe931fdb12 Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Sat, 21 Oct 2023 13:57:50 +0200 Subject: [PATCH] Save return type computed from type annotation in ComputedFieldInfo --- pydantic/_internal/_generate_schema.py | 3 +++ tests/test_computed_fields.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/pydantic/_internal/_generate_schema.py b/pydantic/_internal/_generate_schema.py index ef929aba95..dc29247170 100644 --- a/pydantic/_internal/_generate_schema.py +++ b/pydantic/_internal/_generate_schema.py @@ -1509,6 +1509,9 @@ def _computed_field_schema( ) return_type = replace_types(return_type, self._typevars_map) + # Create a new ComputedFieldInfo so that different type parametrizations of the same + # generic model's computed field can have different return types. + d.info = dataclasses.replace(d.info, return_type=return_type) return_type_schema = self.generate_schema(return_type) # Apply serializers to computed field if there exist return_type_schema = self._apply_field_serializers( diff --git a/tests/test_computed_fields.py b/tests/test_computed_fields.py index a51ae2771d..322ab40bb1 100644 --- a/tests/test_computed_fields.py +++ b/tests/test_computed_fields.py @@ -736,6 +736,10 @@ def double_x(self) -> T: assert A[int](x=1).model_dump() == {'x': 1, 'double_x': 2} assert A[str](x='abc').model_dump() == {'x': 'abc', 'double_x': 'abcabc'} + assert A(x='xxxxxx').model_computed_fields['double_x'].return_type == T + assert A[int](x=123).model_computed_fields['double_x'].return_type == int + assert A[str](x='x').model_computed_fields['double_x'].return_type == str + class B(BaseModel, Generic[T]): @computed_field @property