From 18c3880776aea074a2e237c267d180f5a3855b7b Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Wed, 25 Oct 2023 03:33:53 +0200 Subject: [PATCH] Save return type generated from type annotation in ComputedFieldInfo (#7889) --- 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 921a636933..6980b414b0 100644 --- a/pydantic/_internal/_generate_schema.py +++ b/pydantic/_internal/_generate_schema.py @@ -1515,6 +1515,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