|
16 | 16 | import annotated_types
|
17 | 17 | import typing_extensions
|
18 | 18 | from pydantic_core import PydanticUndefined
|
19 |
| -from typing_extensions import TypeAlias, Unpack, deprecated |
| 19 | +from typing_extensions import Self, TypeAlias, Unpack, deprecated |
20 | 20 | from typing_inspection import typing_objects
|
21 | 21 | from typing_inspection.introspection import UNKNOWN, AnnotationSource, ForbiddenQualifier, Qualifier, inspect_annotation
|
22 | 22 |
|
@@ -349,7 +349,7 @@ class MyModel(pydantic.BaseModel):
|
349 | 349 | field_info_annotations = [a for a in metadata if isinstance(a, FieldInfo)]
|
350 | 350 | field_info = FieldInfo.merge_field_infos(*field_info_annotations, annotation=type_expr)
|
351 | 351 |
|
352 |
| - new_field_info = copy(field_info) |
| 352 | + new_field_info = field_info._copy() |
353 | 353 | new_field_info.annotation = type_expr
|
354 | 354 | new_field_info.frozen = final or field_info.frozen
|
355 | 355 | field_metadata: list[Any] = []
|
@@ -478,7 +478,7 @@ def merge_field_infos(*field_infos: FieldInfo, **overrides: Any) -> FieldInfo:
|
478 | 478 | """
|
479 | 479 | if len(field_infos) == 1:
|
480 | 480 | # No merging necessary, but we still need to make a copy and apply the overrides
|
481 |
| - field_info = copy(field_infos[0]) |
| 481 | + field_info = field_infos[0]._copy() |
482 | 482 | field_info._attributes_set.update(overrides)
|
483 | 483 |
|
484 | 484 | default_override = overrides.pop('default', PydanticUndefined)
|
@@ -588,6 +588,15 @@ def _collect_metadata(kwargs: dict[str, Any]) -> list[Any]:
|
588 | 588 | metadata.append(_fields.pydantic_general_metadata(**general_metadata))
|
589 | 589 | return metadata
|
590 | 590 |
|
| 591 | + def _copy(self) -> Self: |
| 592 | + copied = copy(self) |
| 593 | + for attr_name in ('metadata', '_attributes_set', '_qualifiers'): |
| 594 | + # Apply "deep-copy" behavior on collections attributes: |
| 595 | + value = getattr(copied, attr_name).copy() |
| 596 | + setattr(copied, attr_name, value) |
| 597 | + |
| 598 | + return copied |
| 599 | + |
591 | 600 | @property
|
592 | 601 | def deprecation_message(self) -> str | None:
|
593 | 602 | """The deprecation message to be emitted, or `None` if not set."""
|
|
0 commit comments