Coverage for pydantic/main.py: 98.11%
550 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-13 19:35 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-13 19:35 +0000
1"""Logic for creating models."""
3# Because `dict` is in the local namespace of the `BaseModel` class, we use `Dict` for annotations.
4# TODO v3 fallback to `dict` when the deprecated `dict` method gets removed.
5# ruff: noqa: UP035
7from __future__ import annotations as _annotations 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
9import operator 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
10import sys 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
11import types 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
12import typing 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
13import warnings 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
14from collections.abc import Generator, Mapping 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
15from copy import copy, deepcopy 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
16from functools import cached_property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
17from typing import ( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
18 TYPE_CHECKING,
19 Any,
20 Callable,
21 ClassVar,
22 Dict,
23 Literal,
24 TypeVar,
25 Union,
26 cast,
27 overload,
28)
30import pydantic_core 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
31import typing_extensions 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
32from pydantic_core import PydanticUndefined, ValidationError 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
33from typing_extensions import Self, TypeAlias, Unpack 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
35from . import PydanticDeprecatedSince20, PydanticDeprecatedSince211 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
36from ._internal import ( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
37 _config,
38 _decorators,
39 _fields,
40 _forward_ref,
41 _generics,
42 _mock_val_ser,
43 _model_construction,
44 _namespace_utils,
45 _repr,
46 _typing_extra,
47 _utils,
48)
49from ._migration import getattr_migration 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
50from .aliases import AliasChoices, AliasPath 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
51from .annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
52from .config import ConfigDict 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
53from .errors import PydanticUndefinedAnnotation, PydanticUserError 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
54from .json_schema import DEFAULT_REF_TEMPLATE, GenerateJsonSchema, JsonSchemaMode, JsonSchemaValue, model_json_schema 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
55from .plugin._schema_validator import PluggableSchemaValidator 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
57if TYPE_CHECKING: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
58 from inspect import Signature
59 from pathlib import Path
61 from pydantic_core import CoreSchema, SchemaSerializer, SchemaValidator
63 from ._internal._namespace_utils import MappingNamespace
64 from ._internal._utils import AbstractSetIntStr, MappingIntStrAny
65 from .deprecated.parse import Protocol as DeprecatedParseProtocol
66 from .fields import ComputedFieldInfo, FieldInfo, ModelPrivateAttr 1o
67else:
68 # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915
69 # and https://youtrack.jetbrains.com/issue/PY-51428
70 DeprecationWarning = PydanticDeprecatedSince20 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
72__all__ = 'BaseModel', 'create_model' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
74# Keep these type aliases available at runtime:
75TupleGenerator: TypeAlias = Generator[tuple[str, Any], None, None] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
76# NOTE: In reality, `bool` should be replaced by `Literal[True]` but mypy fails to correctly apply bidirectional
77# type inference (e.g. when using `{'a': {'b': True}}`):
78# NOTE: Keep this type alias in sync with the stub definition in `pydantic-core`:
79IncEx: TypeAlias = Union[set[int], set[str], Mapping[int, Union['IncEx', bool]], Mapping[str, Union['IncEx', bool]]] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
81_object_setattr = _model_construction.object_setattr 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
84def _check_frozen(model_cls: type[BaseModel], name: str, value: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
85 if model_cls.model_config.get('frozen'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
86 error_type = 'frozen_instance' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
87 elif getattr(model_cls.__pydantic_fields__.get(name), 'frozen', False): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
88 error_type = 'frozen_field' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
89 else:
90 return 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
92 raise ValidationError.from_exception_data( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
93 model_cls.__name__, [{'type': error_type, 'loc': (name,), 'input': value}]
94 )
97def _model_field_setattr_handler(model: BaseModel, name: str, val: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
98 model.__dict__[name] = val 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
99 model.__pydantic_fields_set__.add(name) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
102_SIMPLE_SETATTR_HANDLERS: Mapping[str, Callable[[BaseModel, str, Any], None]] = { 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
103 'model_field': _model_field_setattr_handler,
104 'validate_assignment': lambda model, name, val: model.__pydantic_validator__.validate_assignment(model, name, val), # pyright: ignore[reportAssignmentType]
105 'private': lambda model, name, val: model.__pydantic_private__.__setitem__(name, val), # pyright: ignore[reportOptionalMemberAccess]
106 'cached_property': lambda model, name, val: model.__dict__.__setitem__(name, val),
107 'extra_known': lambda model, name, val: _object_setattr(model, name, val),
108}
111class BaseModel(metaclass=_model_construction.ModelMetaclass): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
112 """!!! abstract "Usage Documentation"
113 [Models](../concepts/models.md)
115 A base class for creating Pydantic models.
117 Attributes:
118 __class_vars__: The names of the class variables defined on the model.
119 __private_attributes__: Metadata about the private attributes of the model.
120 __signature__: The synthesized `__init__` [`Signature`][inspect.Signature] of the model.
122 __pydantic_complete__: Whether model building is completed, or if there are still undefined fields.
123 __pydantic_core_schema__: The core schema of the model.
124 __pydantic_custom_init__: Whether the model has a custom `__init__` function.
125 __pydantic_decorators__: Metadata containing the decorators defined on the model.
126 This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1.
127 __pydantic_generic_metadata__: Metadata for generic models; contains data used for a similar purpose to
128 __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these.
129 __pydantic_parent_namespace__: Parent namespace of the model, used for automatic rebuilding of models.
130 __pydantic_post_init__: The name of the post-init method for the model, if defined.
131 __pydantic_root_model__: Whether the model is a [`RootModel`][pydantic.root_model.RootModel].
132 __pydantic_serializer__: The `pydantic-core` `SchemaSerializer` used to dump instances of the model.
133 __pydantic_validator__: The `pydantic-core` `SchemaValidator` used to validate instances of the model.
135 __pydantic_fields__: A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects.
136 __pydantic_computed_fields__: A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects.
138 __pydantic_extra__: A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra]
139 is set to `'allow'`.
140 __pydantic_fields_set__: The names of fields explicitly set during instantiation.
141 __pydantic_private__: Values of private attributes set on the model instance.
142 """
144 # Note: Many of the below class vars are defined in the metaclass, but we define them here for type checking purposes.
146 model_config: ClassVar[ConfigDict] = ConfigDict() 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
147 """ 1mrnsciadotuvwjkefKLGHIJpxqyglbh
148 Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].
149 """
151 __class_vars__: ClassVar[set[str]] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
152 """The names of the class variables defined on the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
154 __private_attributes__: ClassVar[Dict[str, ModelPrivateAttr]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
155 """Metadata about the private attributes of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
157 __signature__: ClassVar[Signature] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
158 """The synthesized `__init__` [`Signature`][inspect.Signature] of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
160 __pydantic_complete__: ClassVar[bool] = False 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
161 """Whether model building is completed, or if there are still undefined fields.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
163 __pydantic_core_schema__: ClassVar[CoreSchema] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
164 """The core schema of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
166 __pydantic_custom_init__: ClassVar[bool] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
167 """Whether the model has a custom `__init__` method.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
169 # Must be set for `GenerateSchema.model_schema` to work for a plain `BaseModel` annotation.
170 __pydantic_decorators__: ClassVar[_decorators.DecoratorInfos] = _decorators.DecoratorInfos() 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
171 """Metadata containing the decorators defined on the model. 1mrnsciadotuvwjkefKLGHIJpxqyglbh
172 This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1."""
174 __pydantic_generic_metadata__: ClassVar[_generics.PydanticGenericMetadata] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
175 """Metadata for generic models; contains data used for a similar purpose to 1mrnsciadotuvwjkefKLGHIJpxqyglbh
176 __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these."""
178 __pydantic_parent_namespace__: ClassVar[Dict[str, Any] | None] = None # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
179 """Parent namespace of the model, used for automatic rebuilding of models.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
181 __pydantic_post_init__: ClassVar[None | Literal['model_post_init']] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
182 """The name of the post-init method for the model, if defined.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
184 __pydantic_root_model__: ClassVar[bool] = False 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
185 """Whether the model is a [`RootModel`][pydantic.root_model.RootModel].""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
187 __pydantic_serializer__: ClassVar[SchemaSerializer] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
188 """The `pydantic-core` `SchemaSerializer` used to dump instances of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
190 __pydantic_validator__: ClassVar[SchemaValidator | PluggableSchemaValidator] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
191 """The `pydantic-core` `SchemaValidator` used to validate instances of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
193 __pydantic_fields__: ClassVar[Dict[str, FieldInfo]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
194 """A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects. 1mrnsciadotuvwjkefKLGHIJpxqyglbh
195 This replaces `Model.__fields__` from Pydantic V1.
196 """
198 __pydantic_setattr_handlers__: ClassVar[Dict[str, Callable[[BaseModel, str, Any], None]]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
199 """`__setattr__` handlers. Memoizing the handlers leads to a dramatic performance improvement in `__setattr__`""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
201 __pydantic_computed_fields__: ClassVar[Dict[str, ComputedFieldInfo]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
202 """A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
204 __pydantic_extra__: dict[str, Any] | None = _model_construction.NoInitField(init=False) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
205 """A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra] is set to `'allow'`.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
207 __pydantic_fields_set__: set[str] = _model_construction.NoInitField(init=False) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
208 """The names of fields explicitly set during instantiation.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
210 __pydantic_private__: dict[str, Any] | None = _model_construction.NoInitField(init=False) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
211 """Values of private attributes set on the model instance.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh
213 if not TYPE_CHECKING: 213 ↛ 231line 213 didn't jump to line 231 because the condition on line 213 was always true1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
214 # Prevent `BaseModel` from being instantiated directly
215 # (defined in an `if not TYPE_CHECKING` block for clarity and to avoid type checking errors):
216 __pydantic_core_schema__ = _mock_val_ser.MockCoreSchema( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
217 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly',
218 code='base-model-instantiated',
219 )
220 __pydantic_validator__ = _mock_val_ser.MockValSer( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
221 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly',
222 val_or_ser='validator',
223 code='base-model-instantiated',
224 )
225 __pydantic_serializer__ = _mock_val_ser.MockValSer( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
226 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly',
227 val_or_ser='serializer',
228 code='base-model-instantiated',
229 )
231 __slots__ = '__dict__', '__pydantic_fields_set__', '__pydantic_extra__', '__pydantic_private__' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
233 def __init__(self, /, **data: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
234 """Create a new model by parsing and validating input data from keyword arguments.
236 Raises [`ValidationError`][pydantic_core.ValidationError] if the input data cannot be
237 validated to form a valid model.
239 `self` is explicitly positional-only to allow `self` as a field name.
240 """
241 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks
242 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
243 validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
244 if self is not validated_self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
245 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
246 'A custom validator is returning a value other than `self`.\n'
247 "Returning anything other than `self` from a top level model validator isn't supported when validating via `__init__`.\n"
248 'See the `model_validator` docs (https://docs.pydantic.dev/latest/concepts/validators/#model-validators) for more details.',
249 stacklevel=2,
250 )
252 # The following line sets a flag that we use to determine when `__init__` gets overridden by the user
253 __init__.__pydantic_base_init__ = True # pyright: ignore[reportFunctionMemberAccess] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
255 @_utils.deprecated_instance_property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
256 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
257 def model_fields(cls) -> dict[str, FieldInfo]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
258 """A mapping of field names to their respective [`FieldInfo`][pydantic.fields.FieldInfo] instances.
260 !!! warning
261 Accessing this attribute from a model instance is deprecated, and will not work in Pydantic V3.
262 Instead, you should access this attribute from the model class.
263 """
264 return getattr(cls, '__pydantic_fields__', {}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
266 @_utils.deprecated_instance_property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
267 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
268 def model_computed_fields(cls) -> dict[str, ComputedFieldInfo]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
269 """A mapping of computed field names to their respective [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] instances.
271 !!! warning
272 Accessing this attribute from a model instance is deprecated, and will not work in Pydantic V3.
273 Instead, you should access this attribute from the model class.
274 """
275 return getattr(cls, '__pydantic_computed_fields__', {}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
277 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
278 def model_extra(self) -> dict[str, Any] | None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
279 """Get extra fields set during validation.
281 Returns:
282 A dictionary of extra fields, or `None` if `config.extra` is not set to `"allow"`.
283 """
284 return self.__pydantic_extra__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
286 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
287 def model_fields_set(self) -> set[str]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
288 """Returns the set of fields that have been explicitly set on this model instance.
290 Returns:
291 A set of strings representing the fields that have been set,
292 i.e. that were not filled from defaults.
293 """
294 return self.__pydantic_fields_set__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
296 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
297 def model_construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: # noqa: C901 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
298 """Creates a new instance of the `Model` class with validated data.
300 Creates a new model setting `__dict__` and `__pydantic_fields_set__` from trusted or pre-validated data.
301 Default values are respected, but no other validation is performed.
303 !!! note
304 `model_construct()` generally respects the `model_config.extra` setting on the provided model.
305 That is, if `model_config.extra == 'allow'`, then all extra passed values are added to the model instance's `__dict__`
306 and `__pydantic_extra__` fields. If `model_config.extra == 'ignore'` (the default), then all extra passed values are ignored.
307 Because no validation is performed with a call to `model_construct()`, having `model_config.extra == 'forbid'` does not result in
308 an error if extra values are passed, but they will be ignored.
310 Args:
311 _fields_set: A set of field names that were originally explicitly set during instantiation. If provided,
312 this is directly used for the [`model_fields_set`][pydantic.BaseModel.model_fields_set] attribute.
313 Otherwise, the field names from the `values` argument will be used.
314 values: Trusted or pre-validated data dictionary.
316 Returns:
317 A new instance of the `Model` class with validated data.
318 """
319 m = cls.__new__(cls) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
320 fields_values: dict[str, Any] = {} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
321 fields_set = set() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
323 for name, field in cls.__pydantic_fields__.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
324 if field.alias is not None and field.alias in values: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
325 fields_values[name] = values.pop(field.alias) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
326 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
328 if (name not in fields_set) and (field.validation_alias is not None): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
329 validation_aliases: list[str | AliasPath] = ( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
330 field.validation_alias.choices
331 if isinstance(field.validation_alias, AliasChoices)
332 else [field.validation_alias]
333 )
335 for alias in validation_aliases: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
336 if isinstance(alias, str) and alias in values: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
337 fields_values[name] = values.pop(alias) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
338 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
339 break 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
340 elif isinstance(alias, AliasPath): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
341 value = alias.search_dict_for_path(values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
342 if value is not PydanticUndefined: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
343 fields_values[name] = value 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
344 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
345 break 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
347 if name not in fields_set: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
348 if name in values: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
349 fields_values[name] = values.pop(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
350 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
351 elif not field.is_required(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
352 fields_values[name] = field.get_default(call_default_factory=True, validated_data=fields_values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
353 if _fields_set is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
354 _fields_set = fields_set 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
356 _extra: dict[str, Any] | None = values if cls.model_config.get('extra') == 'allow' else None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
357 _object_setattr(m, '__dict__', fields_values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
358 _object_setattr(m, '__pydantic_fields_set__', _fields_set) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
359 if not cls.__pydantic_root_model__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
360 _object_setattr(m, '__pydantic_extra__', _extra) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
362 if cls.__pydantic_post_init__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
363 m.model_post_init(None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
364 # update private attributes with values set
365 if hasattr(m, '__pydantic_private__') and m.__pydantic_private__ is not None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
366 for k, v in values.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
367 if k in m.__private_attributes__: 367 ↛ 366line 367 didn't jump to line 366 because the condition on line 367 was always true1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
368 m.__pydantic_private__[k] = v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
370 elif not cls.__pydantic_root_model__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
371 # Note: if there are any private attributes, cls.__pydantic_post_init__ would exist
372 # Since it doesn't, that means that `__pydantic_private__` should be set to None
373 _object_setattr(m, '__pydantic_private__', None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
375 return m 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
377 def model_copy(self, *, update: Mapping[str, Any] | None = None, deep: bool = False) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
378 """!!! abstract "Usage Documentation"
379 [`model_copy`](../concepts/serialization.md#model_copy)
381 Returns a copy of the model.
383 !!! note
384 The underlying instance's [`__dict__`][object.__dict__] attribute is copied. This
385 might have unexpected side effects if you store anything in it, on top of the model
386 fields (e.g. the value of [cached properties][functools.cached_property]).
388 Args:
389 update: Values to change/add in the new model. Note: the data is not validated
390 before creating the new model. You should trust this data.
391 deep: Set to `True` to make a deep copy of the model.
393 Returns:
394 New model instance.
395 """
396 copied = self.__deepcopy__() if deep else self.__copy__() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
397 if update: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
398 if self.model_config.get('extra') == 'allow': 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
399 for k, v in update.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
400 if k in self.__pydantic_fields__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
401 copied.__dict__[k] = v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
402 else:
403 if copied.__pydantic_extra__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
404 copied.__pydantic_extra__ = {} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
405 copied.__pydantic_extra__[k] = v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
406 else:
407 copied.__dict__.update(update) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
408 copied.__pydantic_fields_set__.update(update.keys()) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
409 return copied 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
411 def model_dump( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
412 self,
413 *,
414 mode: Literal['json', 'python'] | str = 'python',
415 include: IncEx | None = None,
416 exclude: IncEx | None = None,
417 context: Any | None = None,
418 by_alias: bool = False,
419 exclude_unset: bool = False,
420 exclude_defaults: bool = False,
421 exclude_none: bool = False,
422 round_trip: bool = False,
423 warnings: bool | Literal['none', 'warn', 'error'] = True,
424 fallback: Callable[[Any], Any] | None = None,
425 serialize_as_any: bool = False,
426 ) -> dict[str, Any]:
427 """!!! abstract "Usage Documentation"
428 [`model_dump`](../concepts/serialization.md#modelmodel_dump)
430 Generate a dictionary representation of the model, optionally specifying which fields to include or exclude.
432 Args:
433 mode: The mode in which `to_python` should run.
434 If mode is 'json', the output will only contain JSON serializable types.
435 If mode is 'python', the output may contain non-JSON-serializable Python objects.
436 include: A set of fields to include in the output.
437 exclude: A set of fields to exclude from the output.
438 context: Additional context to pass to the serializer.
439 by_alias: Whether to use the field's alias in the dictionary key if defined.
440 exclude_unset: Whether to exclude fields that have not been explicitly set.
441 exclude_defaults: Whether to exclude fields that are set to their default value.
442 exclude_none: Whether to exclude fields that have a value of `None`.
443 round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T].
444 warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors,
445 "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError].
446 fallback: A function to call when an unknown value is encountered. If not provided,
447 a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised.
448 serialize_as_any: Whether to serialize fields with duck-typing serialization behavior.
450 Returns:
451 A dictionary representation of the model.
452 """
453 return self.__pydantic_serializer__.to_python( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
454 self,
455 mode=mode,
456 by_alias=by_alias,
457 include=include,
458 exclude=exclude,
459 context=context,
460 exclude_unset=exclude_unset,
461 exclude_defaults=exclude_defaults,
462 exclude_none=exclude_none,
463 round_trip=round_trip,
464 warnings=warnings,
465 fallback=fallback,
466 serialize_as_any=serialize_as_any,
467 )
469 def model_dump_json( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
470 self,
471 *,
472 indent: int | None = None,
473 include: IncEx | None = None,
474 exclude: IncEx | None = None,
475 context: Any | None = None,
476 by_alias: bool = False,
477 exclude_unset: bool = False,
478 exclude_defaults: bool = False,
479 exclude_none: bool = False,
480 round_trip: bool = False,
481 warnings: bool | Literal['none', 'warn', 'error'] = True,
482 fallback: Callable[[Any], Any] | None = None,
483 serialize_as_any: bool = False,
484 ) -> str:
485 """!!! abstract "Usage Documentation"
486 [`model_dump_json`](../concepts/serialization.md#modelmodel_dump_json)
488 Generates a JSON representation of the model using Pydantic's `to_json` method.
490 Args:
491 indent: Indentation to use in the JSON output. If None is passed, the output will be compact.
492 include: Field(s) to include in the JSON output.
493 exclude: Field(s) to exclude from the JSON output.
494 context: Additional context to pass to the serializer.
495 by_alias: Whether to serialize using field aliases.
496 exclude_unset: Whether to exclude fields that have not been explicitly set.
497 exclude_defaults: Whether to exclude fields that are set to their default value.
498 exclude_none: Whether to exclude fields that have a value of `None`.
499 round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T].
500 warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors,
501 "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError].
502 fallback: A function to call when an unknown value is encountered. If not provided,
503 a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised.
504 serialize_as_any: Whether to serialize fields with duck-typing serialization behavior.
506 Returns:
507 A JSON string representation of the model.
508 """
509 return self.__pydantic_serializer__.to_json( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
510 self,
511 indent=indent,
512 include=include,
513 exclude=exclude,
514 context=context,
515 by_alias=by_alias,
516 exclude_unset=exclude_unset,
517 exclude_defaults=exclude_defaults,
518 exclude_none=exclude_none,
519 round_trip=round_trip,
520 warnings=warnings,
521 fallback=fallback,
522 serialize_as_any=serialize_as_any,
523 ).decode()
525 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
526 def model_json_schema( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
527 cls,
528 by_alias: bool = True,
529 ref_template: str = DEFAULT_REF_TEMPLATE,
530 schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema,
531 mode: JsonSchemaMode = 'validation',
532 ) -> dict[str, Any]:
533 """Generates a JSON schema for a model class.
535 Args:
536 by_alias: Whether to use attribute aliases or not.
537 ref_template: The reference template.
538 schema_generator: To override the logic used to generate the JSON schema, as a subclass of
539 `GenerateJsonSchema` with your desired modifications
540 mode: The mode in which to generate the schema.
542 Returns:
543 The JSON schema for the given model class.
544 """
545 return model_json_schema( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
546 cls, by_alias=by_alias, ref_template=ref_template, schema_generator=schema_generator, mode=mode
547 )
549 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
550 def model_parametrized_name(cls, params: tuple[type[Any], ...]) -> str: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
551 """Compute the class name for parametrizations of generic classes.
553 This method can be overridden to achieve a custom naming scheme for generic BaseModels.
555 Args:
556 params: Tuple of types of the class. Given a generic class
557 `Model` with 2 type variables and a concrete model `Model[str, int]`,
558 the value `(str, int)` would be passed to `params`.
560 Returns:
561 String representing the new class where `params` are passed to `cls` as type variables.
563 Raises:
564 TypeError: Raised when trying to generate concrete names for non-generic models.
565 """
566 if not issubclass(cls, typing.Generic): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
567 raise TypeError('Concrete names should only be generated for generic models.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
569 # Any strings received should represent forward references, so we handle them specially below.
570 # If we eventually move toward wrapping them in a ForwardRef in __class_getitem__ in the future,
571 # we may be able to remove this special case.
572 param_names = [param if isinstance(param, str) else _repr.display_as_type(param) for param in params] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
573 params_component = ', '.join(param_names) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
574 return f'{cls.__name__}[{params_component}]' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
576 def model_post_init(self, context: Any, /) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
577 """Override this method to perform additional initialization after `__init__` and `model_construct`.
578 This is useful if you want to do some validation that requires the entire model to be initialized.
579 """
580 pass 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
582 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
583 def model_rebuild( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
584 cls,
585 *,
586 force: bool = False,
587 raise_errors: bool = True,
588 _parent_namespace_depth: int = 2,
589 _types_namespace: MappingNamespace | None = None,
590 ) -> bool | None:
591 """Try to rebuild the pydantic-core schema for the model.
593 This may be necessary when one of the annotations is a ForwardRef which could not be resolved during
594 the initial attempt to build the schema, and automatic rebuilding fails.
596 Args:
597 force: Whether to force the rebuilding of the model schema, defaults to `False`.
598 raise_errors: Whether to raise errors, defaults to `True`.
599 _parent_namespace_depth: The depth level of the parent namespace, defaults to 2.
600 _types_namespace: The types namespace, defaults to `None`.
602 Returns:
603 Returns `None` if the schema is already "complete" and rebuilding was not required.
604 If rebuilding _was_ required, returns `True` if rebuilding was successful, otherwise `False`.
605 """
606 if not force and cls.__pydantic_complete__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
607 return None 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
609 for attr in ('__pydantic_core_schema__', '__pydantic_validator__', '__pydantic_serializer__'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
610 if attr in cls.__dict__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
611 # Deleting the validator/serializer is necessary as otherwise they can get reused in
612 # pydantic-core. Same applies for the core schema that can be reused in schema generation.
613 delattr(cls, attr) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
615 cls.__pydantic_complete__ = False 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
617 if _types_namespace is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
618 rebuild_ns = _types_namespace 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
619 elif _parent_namespace_depth > 0: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
620 rebuild_ns = _typing_extra.parent_frame_namespace(parent_depth=_parent_namespace_depth, force=True) or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
621 else:
622 rebuild_ns = {} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
624 parent_ns = _model_construction.unpack_lenient_weakvaluedict(cls.__pydantic_parent_namespace__) or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
626 ns_resolver = _namespace_utils.NsResolver( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
627 parent_namespace={**rebuild_ns, **parent_ns},
628 )
630 if not cls.__pydantic_fields_complete__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
631 typevars_map = _generics.get_model_typevars_map(cls) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
632 try: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
633 cls.__pydantic_fields__ = _fields.rebuild_model_fields( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
634 cls,
635 ns_resolver=ns_resolver,
636 typevars_map=typevars_map,
637 )
638 except NameError as e: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
639 exc = PydanticUndefinedAnnotation.from_name_error(e) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
640 _mock_val_ser.set_model_mocks(cls, f'`{exc.name}`') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
641 if raise_errors: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
642 raise exc from e 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
644 if not raise_errors and not cls.__pydantic_fields_complete__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
645 # No need to continue with schema gen, it is guaranteed to fail
646 return False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
648 assert cls.__pydantic_fields_complete__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
650 return _model_construction.complete_model_class( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
651 cls,
652 _config.ConfigWrapper(cls.model_config, check=False),
653 raise_errors=raise_errors,
654 ns_resolver=ns_resolver,
655 )
657 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
658 def model_validate( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
659 cls,
660 obj: Any,
661 *,
662 strict: bool | None = None,
663 from_attributes: bool | None = None,
664 context: Any | None = None,
665 ) -> Self:
666 """Validate a pydantic model instance.
668 Args:
669 obj: The object to validate.
670 strict: Whether to enforce types strictly.
671 from_attributes: Whether to extract data from object attributes.
672 context: Additional context to pass to the validator.
674 Raises:
675 ValidationError: If the object could not be validated.
677 Returns:
678 The validated model instance.
679 """
680 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks
681 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
682 return cls.__pydantic_validator__.validate_python( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
683 obj, strict=strict, from_attributes=from_attributes, context=context
684 )
686 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
687 def model_validate_json( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
688 cls,
689 json_data: str | bytes | bytearray,
690 *,
691 strict: bool | None = None,
692 context: Any | None = None,
693 ) -> Self:
694 """!!! abstract "Usage Documentation"
695 [JSON Parsing](../concepts/json.md#json-parsing)
697 Validate the given JSON data against the Pydantic model.
699 Args:
700 json_data: The JSON data to validate.
701 strict: Whether to enforce types strictly.
702 context: Extra variables to pass to the validator.
704 Returns:
705 The validated Pydantic model.
707 Raises:
708 ValidationError: If `json_data` is not a JSON string or the object could not be validated.
709 """
710 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks
711 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
712 return cls.__pydantic_validator__.validate_json(json_data, strict=strict, context=context) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
714 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
715 def model_validate_strings( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
716 cls,
717 obj: Any,
718 *,
719 strict: bool | None = None,
720 context: Any | None = None,
721 ) -> Self:
722 """Validate the given object with string data against the Pydantic model.
724 Args:
725 obj: The object containing string data to validate.
726 strict: Whether to enforce types strictly.
727 context: Extra variables to pass to the validator.
729 Returns:
730 The validated Pydantic model.
731 """
732 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks
733 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
734 return cls.__pydantic_validator__.validate_strings(obj, strict=strict, context=context) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
736 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
737 def __get_pydantic_core_schema__(cls, source: type[BaseModel], handler: GetCoreSchemaHandler, /) -> CoreSchema: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
738 # This warning is only emitted when calling `super().__get_pydantic_core_schema__` from a model subclass.
739 # In the generate schema logic, this method (`BaseModel.__get_pydantic_core_schema__`) is special cased to
740 # *not* be called if not overridden.
741 warnings.warn(
742 'The `__get_pydantic_core_schema__` method of the `BaseModel` class is deprecated. If you are calling '
743 '`super().__get_pydantic_core_schema__` when overriding the method on a Pydantic model, consider using '
744 '`handler(source)` instead. However, note that overriding this method on models can lead to unexpected '
745 'side effects.',
746 PydanticDeprecatedSince211,
747 stacklevel=2,
748 )
749 # Logic copied over from `GenerateSchema._model_schema`:
750 schema = cls.__dict__.get('__pydantic_core_schema__')
751 if schema is not None and not isinstance(schema, _mock_val_ser.MockCoreSchema):
752 return cls.__pydantic_core_schema__
754 return handler(source)
756 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
757 def __get_pydantic_json_schema__( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
758 cls,
759 core_schema: CoreSchema,
760 handler: GetJsonSchemaHandler,
761 /,
762 ) -> JsonSchemaValue:
763 """Hook into generating the model's JSON schema.
765 Args:
766 core_schema: A `pydantic-core` CoreSchema.
767 You can ignore this argument and call the handler with a new CoreSchema,
768 wrap this CoreSchema (`{'type': 'nullable', 'schema': current_schema}`),
769 or just call the handler with the original schema.
770 handler: Call into Pydantic's internal JSON schema generation.
771 This will raise a `pydantic.errors.PydanticInvalidForJsonSchema` if JSON schema
772 generation fails.
773 Since this gets called by `BaseModel.model_json_schema` you can override the
774 `schema_generator` argument to that function to change JSON schema generation globally
775 for a type.
777 Returns:
778 A JSON schema, as a Python object.
779 """
780 return handler(core_schema) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
782 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
783 def __pydantic_init_subclass__(cls, **kwargs: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
784 """This is intended to behave just like `__init_subclass__`, but is called by `ModelMetaclass`
785 only after the class is actually fully initialized. In particular, attributes like `model_fields` will
786 be present when this is called.
788 This is necessary because `__init_subclass__` will always be called by `type.__new__`,
789 and it would require a prohibitively large refactor to the `ModelMetaclass` to ensure that
790 `type.__new__` was called in such a manner that the class would already be sufficiently initialized.
792 This will receive the same `kwargs` that would be passed to the standard `__init_subclass__`, namely,
793 any kwargs passed to the class definition that aren't used internally by pydantic.
795 Args:
796 **kwargs: Any keyword arguments passed to the class definition that aren't used internally
797 by pydantic.
798 """
799 pass 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
801 def __class_getitem__( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
802 cls, typevar_values: type[Any] | tuple[type[Any], ...]
803 ) -> type[BaseModel] | _forward_ref.PydanticRecursiveRef:
804 cached = _generics.get_cached_generic_type_early(cls, typevar_values) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
805 if cached is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
806 return cached 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
808 if cls is BaseModel: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
809 raise TypeError('Type parameters should be placed on typing.Generic, not BaseModel') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
810 if not hasattr(cls, '__parameters__'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
811 raise TypeError(f'{cls} cannot be parametrized because it does not inherit from typing.Generic') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
812 if not cls.__pydantic_generic_metadata__['parameters'] and typing.Generic not in cls.__bases__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
813 raise TypeError(f'{cls} is not a generic class') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
815 if not isinstance(typevar_values, tuple): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
816 typevar_values = (typevar_values,) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
818 # For a model `class Model[T, U, V = int](BaseModel): ...` parametrized with `(str, bool)`,
819 # this gives us `{T: str, U: bool, V: int}`:
820 typevars_map = _generics.map_generic_model_arguments(cls, typevar_values) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
821 # We also update the provided args to use defaults values (`(str, bool)` becomes `(str, bool, int)`):
822 typevar_values = tuple(v for v in typevars_map.values()) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
824 if _utils.all_identical(typevars_map.keys(), typevars_map.values()) and typevars_map: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
825 submodel = cls # if arguments are equal to parameters it's the same object 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
826 _generics.set_cached_generic_type(cls, typevar_values, submodel) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
827 else:
828 parent_args = cls.__pydantic_generic_metadata__['args'] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
829 if not parent_args: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
830 args = typevar_values 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
831 else:
832 args = tuple(_generics.replace_types(arg, typevars_map) for arg in parent_args) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
834 origin = cls.__pydantic_generic_metadata__['origin'] or cls 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
835 model_name = origin.model_parametrized_name(args) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
836 params = tuple( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
837 {param: None for param in _generics.iter_contained_typevars(typevars_map.values())}
838 ) # use dict as ordered set
840 with _generics.generic_recursion_self_type(origin, args) as maybe_self_type: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
841 cached = _generics.get_cached_generic_type_late(cls, typevar_values, origin, args) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
842 if cached is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
843 return cached 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
845 if maybe_self_type is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
846 return maybe_self_type 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
848 # Attempt to rebuild the origin in case new types have been defined
849 try: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
850 # depth 2 gets you above this __class_getitem__ call.
851 # Note that we explicitly provide the parent ns, otherwise
852 # `model_rebuild` will use the parent ns no matter if it is the ns of a module.
853 # We don't want this here, as this has unexpected effects when a model
854 # is being parametrized during a forward annotation evaluation.
855 parent_ns = _typing_extra.parent_frame_namespace(parent_depth=2) or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
856 origin.model_rebuild(_types_namespace=parent_ns) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
857 except PydanticUndefinedAnnotation: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
858 # It's okay if it fails, it just means there are still undefined types
859 # that could be evaluated later.
860 pass 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
862 submodel = _generics.create_generic_submodel(model_name, origin, args, params) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
864 # Cache the generated model *only* if not in the process of parametrizing
865 # another model. In some valid scenarios, we miss the opportunity to cache
866 # it but in some cases this results in `PydanticRecursiveRef` instances left
867 # on `FieldInfo` annotations:
868 if len(_generics.recursively_defined_type_refs()) == 1: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
869 _generics.set_cached_generic_type(cls, typevar_values, submodel, origin, args) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
871 return submodel 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
873 def __copy__(self) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
874 """Returns a shallow copy of the model."""
875 cls = type(self) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
876 m = cls.__new__(cls) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
877 _object_setattr(m, '__dict__', copy(self.__dict__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
878 _object_setattr(m, '__pydantic_extra__', copy(self.__pydantic_extra__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
879 _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
881 if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
882 _object_setattr(m, '__pydantic_private__', None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
883 else:
884 _object_setattr( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
885 m,
886 '__pydantic_private__',
887 {k: v for k, v in self.__pydantic_private__.items() if v is not PydanticUndefined},
888 )
890 return m 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
892 def __deepcopy__(self, memo: dict[int, Any] | None = None) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
893 """Returns a deep copy of the model."""
894 cls = type(self) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
895 m = cls.__new__(cls) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
896 _object_setattr(m, '__dict__', deepcopy(self.__dict__, memo=memo)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
897 _object_setattr(m, '__pydantic_extra__', deepcopy(self.__pydantic_extra__, memo=memo)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
898 # This next line doesn't need a deepcopy because __pydantic_fields_set__ is a set[str],
899 # and attempting a deepcopy would be marginally slower.
900 _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
902 if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
903 _object_setattr(m, '__pydantic_private__', None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
904 else:
905 _object_setattr( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
906 m,
907 '__pydantic_private__',
908 deepcopy({k: v for k, v in self.__pydantic_private__.items() if v is not PydanticUndefined}, memo=memo),
909 )
911 return m 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
913 if not TYPE_CHECKING: 913 ↛ 1049line 913 didn't jump to line 1049 because the condition on line 913 was always true1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
914 # We put `__getattr__` in a non-TYPE_CHECKING block because otherwise, mypy allows arbitrary attribute access
915 # The same goes for __setattr__ and __delattr__, see: https://github.com/pydantic/pydantic/issues/8643
917 def __getattr__(self, item: str) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
918 private_attributes = object.__getattribute__(self, '__private_attributes__') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
919 if item in private_attributes: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
920 attribute = private_attributes[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
921 if hasattr(attribute, '__get__'): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
922 return attribute.__get__(self, type(self)) # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
924 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
925 # Note: self.__pydantic_private__ cannot be None if self.__private_attributes__ has items
926 return self.__pydantic_private__[item] # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
927 except KeyError as exc: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
928 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') from exc 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
929 else:
930 # `__pydantic_extra__` can fail to be set if the model is not yet fully initialized.
931 # See `BaseModel.__repr_args__` for more details
932 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
933 pydantic_extra = object.__getattribute__(self, '__pydantic_extra__') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
934 except AttributeError: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
935 pydantic_extra = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
937 if pydantic_extra: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
938 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
939 return pydantic_extra[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
940 except KeyError as exc: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
941 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') from exc 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
942 else:
943 if hasattr(self.__class__, item): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
944 return super().__getattribute__(item) # Raises AttributeError if appropriate 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
945 else:
946 # this is the current error
947 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
949 def __setattr__(self, name: str, value: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
950 if (setattr_handler := self.__pydantic_setattr_handlers__.get(name)) is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
951 setattr_handler(self, name, value) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
952 # if None is returned from _setattr_handler, the attribute was set directly
953 elif (setattr_handler := self._setattr_handler(name, value)) is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
954 setattr_handler(self, name, value) # call here to not memo on possibly unknown fields 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
955 self.__pydantic_setattr_handlers__[name] = setattr_handler # memoize the handler for faster access 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
957 def _setattr_handler(self, name: str, value: Any) -> Callable[[BaseModel, str, Any], None] | None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
958 """Get a handler for setting an attribute on the model instance.
960 Returns:
961 A handler for setting an attribute on the model instance. Used for memoization of the handler.
962 Memoizing the handlers leads to a dramatic performance improvement in `__setattr__`
963 Returns `None` when memoization is not safe, then the attribute is set directly.
964 """
965 cls = self.__class__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
966 if name in cls.__class_vars__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
967 raise AttributeError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
968 f'{name!r} is a ClassVar of `{cls.__name__}` and cannot be set on an instance. '
969 f'If you want to set a value on the class, use `{cls.__name__}.{name} = value`.'
970 )
971 elif not _fields.is_valid_field_name(name): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
972 if (attribute := cls.__private_attributes__.get(name)) is not None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
973 if hasattr(attribute, '__set__'): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
974 return lambda model, _name, val: attribute.__set__(model, val) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
975 else:
976 return _SIMPLE_SETATTR_HANDLERS['private'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
977 else:
978 _object_setattr(self, name, value) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
979 return None # Can not return memoized handler with possibly freeform attr names 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
981 attr = getattr(cls, name, None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
982 # NOTE: We currently special case properties and `cached_property`, but we might need
983 # to generalize this to all data/non-data descriptors at some point. For non-data descriptors
984 # (such as `cached_property`), it isn't obvious though. `cached_property` caches the value
985 # to the instance's `__dict__`, but other non-data descriptors might do things differently.
986 if isinstance(attr, cached_property): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
987 return _SIMPLE_SETATTR_HANDLERS['cached_property'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
989 _check_frozen(cls, name, value) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
991 # We allow properties to be set only on non frozen models for now (to match dataclasses).
992 # This can be changed if it ever gets requested.
993 if isinstance(attr, property): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
994 return lambda model, _name, val: attr.__set__(model, val) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
995 elif cls.model_config.get('validate_assignment'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
996 return _SIMPLE_SETATTR_HANDLERS['validate_assignment'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
997 elif name not in cls.__pydantic_fields__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
998 if cls.model_config.get('extra') != 'allow': 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
999 # TODO - matching error
1000 raise ValueError(f'"{cls.__name__}" object has no field "{name}"') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1001 elif attr is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1002 # attribute does not exist, so put it in extra
1003 self.__pydantic_extra__[name] = value 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1004 return None # Can not return memoized handler with possibly freeform attr names 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1005 else:
1006 # attribute _does_ exist, and was not in extra, so update it
1007 return _SIMPLE_SETATTR_HANDLERS['extra_known'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1008 else:
1009 return _SIMPLE_SETATTR_HANDLERS['model_field'] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1011 def __delattr__(self, item: str) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1012 cls = self.__class__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1014 if item in self.__private_attributes__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1015 attribute = self.__private_attributes__[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1016 if hasattr(attribute, '__delete__'): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1017 attribute.__delete__(self) # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1018 return 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1020 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1021 # Note: self.__pydantic_private__ cannot be None if self.__private_attributes__ has items
1022 del self.__pydantic_private__[item] # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1023 return 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1024 except KeyError as exc: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1025 raise AttributeError(f'{cls.__name__!r} object has no attribute {item!r}') from exc 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1027 # Allow cached properties to be deleted (even if the class is frozen):
1028 attr = getattr(cls, item, None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1029 if isinstance(attr, cached_property): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1030 return object.__delattr__(self, item) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1032 _check_frozen(cls, name=item, value=None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1034 if item in self.__pydantic_fields__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1035 object.__delattr__(self, item) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1036 elif self.__pydantic_extra__ is not None and item in self.__pydantic_extra__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1037 del self.__pydantic_extra__[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1038 else:
1039 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1040 object.__delattr__(self, item) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1041 except AttributeError: 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1042 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1044 # Because we make use of `@dataclass_transform()`, `__replace__` is already synthesized by
1045 # type checkers, so we define the implementation in this `if not TYPE_CHECKING:` block:
1046 def __replace__(self, **changes: Any) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1047 return self.model_copy(update=changes) 1adefbh
1049 def __getstate__(self) -> dict[Any, Any]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1050 private = self.__pydantic_private__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1051 if private: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1052 private = {k: v for k, v in private.items() if v is not PydanticUndefined} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1053 return { 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1054 '__dict__': self.__dict__,
1055 '__pydantic_extra__': self.__pydantic_extra__,
1056 '__pydantic_fields_set__': self.__pydantic_fields_set__,
1057 '__pydantic_private__': private,
1058 }
1060 def __setstate__(self, state: dict[Any, Any]) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1061 _object_setattr(self, '__pydantic_fields_set__', state.get('__pydantic_fields_set__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1062 _object_setattr(self, '__pydantic_extra__', state.get('__pydantic_extra__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1063 _object_setattr(self, '__pydantic_private__', state.get('__pydantic_private__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1064 _object_setattr(self, '__dict__', state.get('__dict__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1066 if not TYPE_CHECKING: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1068 def __eq__(self, other: Any) -> bool: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1069 if isinstance(other, BaseModel): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1070 # When comparing instances of generic types for equality, as long as all field values are equal,
1071 # only require their generic origin types to be equal, rather than exact type equality.
1072 # This prevents headaches like MyGeneric(x=1) != MyGeneric[Any](x=1).
1073 self_type = self.__pydantic_generic_metadata__['origin'] or self.__class__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1074 other_type = other.__pydantic_generic_metadata__['origin'] or other.__class__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1076 # Perform common checks first
1077 if not ( 1zACo
1078 self_type == other_type
1079 and getattr(self, '__pydantic_private__', None) == getattr(other, '__pydantic_private__', None)
1080 and self.__pydantic_extra__ == other.__pydantic_extra__
1081 ):
1082 return False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1084 # We only want to compare pydantic fields but ignoring fields is costly.
1085 # We'll perform a fast check first, and fallback only when needed
1086 # See GH-7444 and GH-7825 for rationale and a performance benchmark
1088 # First, do the fast (and sometimes faulty) __dict__ comparison
1089 if self.__dict__ == other.__dict__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1090 # If the check above passes, then pydantic fields are equal, we can return early
1091 return True 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1093 # We don't want to trigger unnecessary costly filtering of __dict__ on all unequal objects, so we return
1094 # early if there are no keys to ignore (we would just return False later on anyway)
1095 model_fields = type(self).__pydantic_fields__.keys() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1096 if self.__dict__.keys() <= model_fields and other.__dict__.keys() <= model_fields: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1097 return False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1099 # If we reach here, there are non-pydantic-fields keys, mapped to unequal values, that we need to ignore
1100 # Resort to costly filtering of the __dict__ objects
1101 # We use operator.itemgetter because it is much faster than dict comprehensions
1102 # NOTE: Contrary to standard python class and instances, when the Model class has a default value for an
1103 # attribute and the model instance doesn't have a corresponding attribute, accessing the missing attribute
1104 # raises an error in BaseModel.__getattr__ instead of returning the class attribute
1105 # So we can use operator.itemgetter() instead of operator.attrgetter()
1106 getter = operator.itemgetter(*model_fields) if model_fields else lambda _: _utils._SENTINEL 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1107 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1108 return getter(self.__dict__) == getter(other.__dict__) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1109 except KeyError:
1110 # In rare cases (such as when using the deprecated BaseModel.copy() method),
1111 # the __dict__ may not contain all model fields, which is how we can get here.
1112 # getter(self.__dict__) is much faster than any 'safe' method that accounts
1113 # for missing keys, and wrapping it in a `try` doesn't slow things down much
1114 # in the common case.
1115 self_fields_proxy = _utils.SafeGetItemProxy(self.__dict__)
1116 other_fields_proxy = _utils.SafeGetItemProxy(other.__dict__)
1117 return getter(self_fields_proxy) == getter(other_fields_proxy)
1119 # other instance is not a BaseModel
1120 else:
1121 return NotImplemented # delegate to the other item in the comparison 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1123 if TYPE_CHECKING: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1124 # We put `__init_subclass__` in a TYPE_CHECKING block because, even though we want the type-checking benefits
1125 # described in the signature of `__init_subclass__` below, we don't want to modify the default behavior of
1126 # subclass initialization.
1128 def __init_subclass__(cls, **kwargs: Unpack[ConfigDict]):
1129 """This signature is included purely to help type-checkers check arguments to class declaration, which
1130 provides a way to conveniently set model_config key/value pairs.
1132 ```python
1133 from pydantic import BaseModel
1135 class MyModel(BaseModel, extra='allow'): ...
1136 ```
1138 However, this may be deceiving, since the _actual_ calls to `__init_subclass__` will not receive any
1139 of the config arguments, and will only receive any keyword arguments passed during class initialization
1140 that are _not_ expected keys in ConfigDict. (This is due to the way `ModelMetaclass.__new__` works.)
1142 Args:
1143 **kwargs: Keyword arguments passed to the class definition, which set model_config
1145 Note:
1146 You may want to override `__pydantic_init_subclass__` instead, which behaves similarly but is called
1147 *after* the class is fully initialized.
1148 """
1150 def __iter__(self) -> TupleGenerator: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1151 """So `dict(model)` works."""
1152 yield from [(k, v) for (k, v) in self.__dict__.items() if not k.startswith('_')] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1153 extra = self.__pydantic_extra__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1154 if extra: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1155 yield from extra.items() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1157 def __repr__(self) -> str: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1158 return f'{self.__repr_name__()}({self.__repr_str__(", ")})' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1160 def __repr_args__(self) -> _repr.ReprArgs: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1161 for k, v in self.__dict__.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1162 field = self.__pydantic_fields__.get(k) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1163 if field and field.repr: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1164 if v is not self: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1165 yield k, v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1166 else:
1167 yield k, self.__repr_recursion__(v) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1168 # `__pydantic_extra__` can fail to be set if the model is not yet fully initialized.
1169 # This can happen if a `ValidationError` is raised during initialization and the instance's
1170 # repr is generated as part of the exception handling. Therefore, we use `getattr` here
1171 # with a fallback, even though the type hints indicate the attribute will always be present.
1172 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1173 pydantic_extra = object.__getattribute__(self, '__pydantic_extra__') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1174 except AttributeError: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1175 pydantic_extra = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1177 if pydantic_extra is not None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1178 yield from ((k, v) for k, v in pydantic_extra.items()) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1179 yield from ((k, getattr(self, k)) for k, v in self.__pydantic_computed_fields__.items() if v.repr) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1181 # take logic from `_repr.Representation` without the side effects of inheritance, see #5740
1182 __repr_name__ = _repr.Representation.__repr_name__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1183 __repr_recursion__ = _repr.Representation.__repr_recursion__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1184 __repr_str__ = _repr.Representation.__repr_str__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1185 __pretty__ = _repr.Representation.__pretty__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1186 __rich_repr__ = _repr.Representation.__rich_repr__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1188 def __str__(self) -> str: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1189 return self.__repr_str__(' ') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1191 # ##### Deprecated methods from v1 #####
1192 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1193 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1194 'The `__fields__` attribute is deprecated, use `model_fields` instead.', category=None
1195 )
1196 def __fields__(self) -> dict[str, FieldInfo]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1197 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1198 'The `__fields__` attribute is deprecated, use `model_fields` instead.',
1199 category=PydanticDeprecatedSince20,
1200 stacklevel=2,
1201 )
1202 return getattr(type(self), '__pydantic_fields__', {}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1204 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1205 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1206 'The `__fields_set__` attribute is deprecated, use `model_fields_set` instead.',
1207 category=None,
1208 )
1209 def __fields_set__(self) -> set[str]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1210 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1211 'The `__fields_set__` attribute is deprecated, use `model_fields_set` instead.',
1212 category=PydanticDeprecatedSince20,
1213 stacklevel=2,
1214 )
1215 return self.__pydantic_fields_set__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1217 @typing_extensions.deprecated('The `dict` method is deprecated; use `model_dump` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1218 def dict( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1219 self,
1220 *,
1221 include: IncEx | None = None,
1222 exclude: IncEx | None = None,
1223 by_alias: bool = False,
1224 exclude_unset: bool = False,
1225 exclude_defaults: bool = False,
1226 exclude_none: bool = False,
1227 ) -> Dict[str, Any]: # noqa UP006
1228 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1229 'The `dict` method is deprecated; use `model_dump` instead.',
1230 category=PydanticDeprecatedSince20,
1231 stacklevel=2,
1232 )
1233 return self.model_dump( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1234 include=include,
1235 exclude=exclude,
1236 by_alias=by_alias,
1237 exclude_unset=exclude_unset,
1238 exclude_defaults=exclude_defaults,
1239 exclude_none=exclude_none,
1240 )
1242 @typing_extensions.deprecated('The `json` method is deprecated; use `model_dump_json` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1243 def json( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1244 self,
1245 *,
1246 include: IncEx | None = None,
1247 exclude: IncEx | None = None,
1248 by_alias: bool = False,
1249 exclude_unset: bool = False,
1250 exclude_defaults: bool = False,
1251 exclude_none: bool = False,
1252 encoder: Callable[[Any], Any] | None = PydanticUndefined, # type: ignore[assignment]
1253 models_as_dict: bool = PydanticUndefined, # type: ignore[assignment]
1254 **dumps_kwargs: Any,
1255 ) -> str:
1256 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1257 'The `json` method is deprecated; use `model_dump_json` instead.',
1258 category=PydanticDeprecatedSince20,
1259 stacklevel=2,
1260 )
1261 if encoder is not PydanticUndefined: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1262 raise TypeError('The `encoder` argument is no longer supported; use field serializers instead.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1263 if models_as_dict is not PydanticUndefined: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1264 raise TypeError('The `models_as_dict` argument is no longer supported; use a model serializer instead.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1265 if dumps_kwargs: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1266 raise TypeError('`dumps_kwargs` keyword arguments are no longer supported.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1267 return self.model_dump_json( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1268 include=include,
1269 exclude=exclude,
1270 by_alias=by_alias,
1271 exclude_unset=exclude_unset,
1272 exclude_defaults=exclude_defaults,
1273 exclude_none=exclude_none,
1274 )
1276 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1277 @typing_extensions.deprecated('The `parse_obj` method is deprecated; use `model_validate` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1278 def parse_obj(cls, obj: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1279 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1280 'The `parse_obj` method is deprecated; use `model_validate` instead.',
1281 category=PydanticDeprecatedSince20,
1282 stacklevel=2,
1283 )
1284 return cls.model_validate(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1286 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1287 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1288 'The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, ' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1289 'otherwise load the data then use `model_validate` instead.',
1290 category=None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1291 )
1292 def parse_raw( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1293 cls,
1294 b: str | bytes, 1ciadCojkefGHIJglbh
1295 *,
1296 content_type: str | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1297 encoding: str = 'utf8', 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1298 proto: DeprecatedParseProtocol | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1299 allow_pickle: bool = False, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1300 ) -> Self: # pragma: no cover 1ciadCojkefGHIJglbh
1301 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1302 'The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, ' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1303 'otherwise load the data then use `model_validate` instead.',
1304 category=PydanticDeprecatedSince20, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1305 stacklevel=2, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1306 )
1307 from .deprecated import parse 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1309 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1310 obj = parse.load_str_bytes( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1311 b, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1312 proto=proto, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1313 content_type=content_type, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1314 encoding=encoding, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1315 allow_pickle=allow_pickle, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1316 )
1317 except (ValueError, TypeError) as exc: 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1318 import json 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1320 # try to match V1
1321 if isinstance(exc, UnicodeDecodeError): 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1322 type_str = 'value_error.unicodedecode'
1323 elif isinstance(exc, json.JSONDecodeError): 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1324 type_str = 'value_error.jsondecode' 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1325 elif isinstance(exc, ValueError):
1326 type_str = 'value_error'
1327 else:
1328 type_str = 'type_error'
1330 # ctx is missing here, but since we've added `input` to the error, we're not pretending it's the same
1331 error: pydantic_core.InitErrorDetails = { 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1332 # The type: ignore on the next line is to ignore the requirement of LiteralString
1333 'type': pydantic_core.PydanticCustomError(type_str, str(exc)), # type: ignore 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1334 'loc': ('__root__',), 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1335 'input': b, 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1336 }
1337 raise pydantic_core.ValidationError.from_exception_data(cls.__name__, [error]) 1zAmrnsciadDEtuvwjkefBFpxqyglbh
1338 return cls.model_validate(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1340 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1341 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1342 'The `parse_file` method is deprecated; load the data from file, then if your data is JSON '
1343 'use `model_validate_json`, otherwise `model_validate` instead.',
1344 category=None,
1345 )
1346 def parse_file( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1347 cls,
1348 path: str | Path,
1349 *,
1350 content_type: str | None = None,
1351 encoding: str = 'utf8',
1352 proto: DeprecatedParseProtocol | None = None,
1353 allow_pickle: bool = False,
1354 ) -> Self:
1355 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1356 'The `parse_file` method is deprecated; load the data from file, then if your data is JSON '
1357 'use `model_validate_json`, otherwise `model_validate` instead.',
1358 category=PydanticDeprecatedSince20,
1359 stacklevel=2,
1360 )
1361 from .deprecated import parse 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1363 obj = parse.load_file( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1364 path,
1365 proto=proto,
1366 content_type=content_type,
1367 encoding=encoding,
1368 allow_pickle=allow_pickle,
1369 )
1370 return cls.parse_obj(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1372 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1373 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1374 'The `from_orm` method is deprecated; set '
1375 "`model_config['from_attributes']=True` and use `model_validate` instead.",
1376 category=None,
1377 )
1378 def from_orm(cls, obj: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1379 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1380 'The `from_orm` method is deprecated; set '
1381 "`model_config['from_attributes']=True` and use `model_validate` instead.",
1382 category=PydanticDeprecatedSince20,
1383 stacklevel=2,
1384 )
1385 if not cls.model_config.get('from_attributes', None): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1386 raise PydanticUserError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1387 'You must set the config attribute `from_attributes=True` to use from_orm', code=None
1388 )
1389 return cls.model_validate(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1391 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1392 @typing_extensions.deprecated('The `construct` method is deprecated; use `model_construct` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1393 def construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1394 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1395 'The `construct` method is deprecated; use `model_construct` instead.',
1396 category=PydanticDeprecatedSince20,
1397 stacklevel=2,
1398 )
1399 return cls.model_construct(_fields_set=_fields_set, **values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1401 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1402 'The `copy` method is deprecated; use `model_copy` instead. ' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1403 'See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.',
1404 category=None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1405 )
1406 def copy( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1407 self,
1408 *,
1409 include: AbstractSetIntStr | MappingIntStrAny | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1410 exclude: AbstractSetIntStr | MappingIntStrAny | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1411 update: Dict[str, Any] | None = None, # noqa UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1412 deep: bool = False, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1413 ) -> Self: # pragma: no cover 1ciadCojkefGHIJglbh
1414 """Returns a copy of the model.
1416 !!! warning "Deprecated"
1417 This method is now deprecated; use `model_copy` instead.
1419 If you need `include` or `exclude`, use:
1421 ```python {test="skip" lint="skip"}
1422 data = self.model_dump(include=include, exclude=exclude, round_trip=True)
1423 data = {**data, **(update or {})}
1424 copied = self.model_validate(data)
1425 ```
1427 Args:
1428 include: Optional set or mapping specifying which fields to include in the copied model.
1429 exclude: Optional set or mapping specifying which fields to exclude in the copied model.
1430 update: Optional dictionary of field-value pairs to override field values in the copied model.
1431 deep: If True, the values of fields that are Pydantic models will be deep-copied.
1433 Returns:
1434 A copy of the model with included, excluded and updated fields as specified.
1435 """
1436 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1437 'The `copy` method is deprecated; use `model_copy` instead. ' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1438 'See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.',
1439 category=PydanticDeprecatedSince20, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1440 stacklevel=2, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1441 )
1442 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1444 values = dict( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1445 copy_internals._iter( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1446 self, to_dict=False, by_alias=False, include=include, exclude=exclude, exclude_unset=False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1447 ),
1448 **(update or {}), 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1449 )
1450 if self.__pydantic_private__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1451 private = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1452 else:
1453 private = {k: v for k, v in self.__pydantic_private__.items() if v is not PydanticUndefined} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1455 if self.__pydantic_extra__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1456 extra: dict[str, Any] | None = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1457 else:
1458 extra = self.__pydantic_extra__.copy() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1459 for k in list(self.__pydantic_extra__): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1460 if k not in values: # k was in the exclude 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1461 extra.pop(k)
1462 for k in list(values): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1463 if k in self.__pydantic_extra__: # k must have come from extra 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1464 extra[k] = values.pop(k) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1466 # new `__pydantic_fields_set__` can have unset optional fields with a set value in `update` kwarg
1467 if update: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1468 fields_set = self.__pydantic_fields_set__ | update.keys() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1469 else:
1470 fields_set = set(self.__pydantic_fields_set__) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1472 # removing excluded fields from `__pydantic_fields_set__`
1473 if exclude: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1474 fields_set -= set(exclude) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1476 return copy_internals._copy_and_set_values(self, values, fields_set, extra, private, deep=deep) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1478 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1479 @typing_extensions.deprecated('The `schema` method is deprecated; use `model_json_schema` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1480 def schema( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1481 cls, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE
1482 ) -> Dict[str, Any]: # noqa UP006
1483 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1484 'The `schema` method is deprecated; use `model_json_schema` instead.',
1485 category=PydanticDeprecatedSince20,
1486 stacklevel=2,
1487 )
1488 return cls.model_json_schema(by_alias=by_alias, ref_template=ref_template) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1490 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1491 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1492 'The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1493 category=None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1494 )
1495 def schema_json( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1496 cls, *, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE, **dumps_kwargs: Any 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1497 ) -> str: # pragma: no cover 1ciadCojkefGHIJglbh
1498 warnings.warn(
1499 'The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.',
1500 category=PydanticDeprecatedSince20,
1501 stacklevel=2,
1502 )
1503 import json
1505 from .deprecated.json import pydantic_encoder
1507 return json.dumps(
1508 cls.model_json_schema(by_alias=by_alias, ref_template=ref_template),
1509 default=pydantic_encoder,
1510 **dumps_kwargs,
1511 )
1513 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1514 @typing_extensions.deprecated('The `validate` method is deprecated; use `model_validate` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1515 def validate(cls, value: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1516 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1517 'The `validate` method is deprecated; use `model_validate` instead.',
1518 category=PydanticDeprecatedSince20,
1519 stacklevel=2,
1520 )
1521 return cls.model_validate(value) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1523 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1524 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1525 'The `update_forward_refs` method is deprecated; use `model_rebuild` instead.',
1526 category=None,
1527 )
1528 def update_forward_refs(cls, **localns: Any) -> None: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1529 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1530 'The `update_forward_refs` method is deprecated; use `model_rebuild` instead.',
1531 category=PydanticDeprecatedSince20,
1532 stacklevel=2,
1533 )
1534 if localns: # pragma: no cover 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1535 raise TypeError('`localns` arguments are not longer accepted.')
1536 cls.model_rebuild(force=True) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1538 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1539 'The private method `_iter` will be removed and should no longer be used.', category=None
1540 )
1541 def _iter(self, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1542 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1543 'The private method `_iter` will be removed and should no longer be used.',
1544 category=PydanticDeprecatedSince20,
1545 stacklevel=2,
1546 )
1547 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1549 return copy_internals._iter(self, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1551 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1552 'The private method `_copy_and_set_values` will be removed and should no longer be used.',
1553 category=None,
1554 )
1555 def _copy_and_set_values(self, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1556 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1557 'The private method `_copy_and_set_values` will be removed and should no longer be used.',
1558 category=PydanticDeprecatedSince20,
1559 stacklevel=2,
1560 )
1561 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1563 return copy_internals._copy_and_set_values(self, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1565 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1566 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1567 'The private method `_get_value` will be removed and should no longer be used.',
1568 category=None,
1569 )
1570 def _get_value(cls, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1571 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1572 'The private method `_get_value` will be removed and should no longer be used.',
1573 category=PydanticDeprecatedSince20,
1574 stacklevel=2,
1575 )
1576 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1578 return copy_internals._get_value(cls, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1580 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1581 'The private method `_calculate_keys` will be removed and should no longer be used.',
1582 category=None,
1583 )
1584 def _calculate_keys(self, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1585 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1586 'The private method `_calculate_keys` will be removed and should no longer be used.',
1587 category=PydanticDeprecatedSince20,
1588 stacklevel=2,
1589 )
1590 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1592 return copy_internals._calculate_keys(self, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1595ModelT = TypeVar('ModelT', bound=BaseModel) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1598@overload 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1599def create_model( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1600 model_name: str, 1ciadCojkefGHIJglbh
1601 /,
1602 *,
1603 __config__: ConfigDict | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1604 __doc__: str | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1605 __base__: None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1606 __module__: str = __name__, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1607 __validators__: dict[str, Callable[..., Any]] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1608 __cls_kwargs__: dict[str, Any] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1609 **field_definitions: Any | tuple[str, Any], 1ciadCojkefGHIJglbh
1610) -> type[BaseModel]: ... 1ciadCojkefGHIJglbh
1613@overload 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1614def create_model( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1615 model_name: str, 1ciadCojkefGHIJglbh
1616 /,
1617 *,
1618 __config__: ConfigDict | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1619 __doc__: str | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1620 __base__: type[ModelT] | tuple[type[ModelT], ...], 1ciadCojkefGHIJglbh
1621 __module__: str = __name__, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1622 __validators__: dict[str, Callable[..., Any]] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1623 __cls_kwargs__: dict[str, Any] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1624 **field_definitions: Any | tuple[str, Any], 1ciadCojkefGHIJglbh
1625) -> type[ModelT]: ... 1ciadCojkefGHIJglbh
1628def create_model( # noqa: C901 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1629 model_name: str,
1630 /,
1631 *,
1632 __config__: ConfigDict | None = None,
1633 __doc__: str | None = None,
1634 __base__: type[ModelT] | tuple[type[ModelT], ...] | None = None,
1635 __module__: str | None = None,
1636 __validators__: dict[str, Callable[..., Any]] | None = None,
1637 __cls_kwargs__: dict[str, Any] | None = None,
1638 # TODO PEP 747: replace `Any` by the TypeForm:
1639 **field_definitions: Any | tuple[str, Any],
1640) -> type[ModelT]:
1641 """!!! abstract "Usage Documentation"
1642 [Dynamic Model Creation](../concepts/models.md#dynamic-model-creation)
1644 Dynamically creates and returns a new Pydantic model, in other words, `create_model` dynamically creates a
1645 subclass of [`BaseModel`][pydantic.BaseModel].
1647 Args:
1648 model_name: The name of the newly created model.
1649 __config__: The configuration of the new model.
1650 __doc__: The docstring of the new model.
1651 __base__: The base class or classes for the new model.
1652 __module__: The name of the module that the model belongs to;
1653 if `None`, the value is taken from `sys._getframe(1)`
1654 __validators__: A dictionary of methods that validate fields. The keys are the names of the validation methods to
1655 be added to the model, and the values are the validation methods themselves. You can read more about functional
1656 validators [here](https://docs.pydantic.dev/2.9/concepts/validators/#field-validators).
1657 __cls_kwargs__: A dictionary of keyword arguments for class creation, such as `metaclass`.
1658 **field_definitions: Field definitions of the new model. Either:
1660 - a single element, representing the type annotation of the field.
1661 - a two-tuple, the first element being the type and the second element the assigned value
1662 (either a default or the [`Field()`][pydantic.Field] function).
1664 Returns:
1665 The new [model][pydantic.BaseModel].
1667 Raises:
1668 PydanticUserError: If `__base__` and `__config__` are both passed.
1669 """
1670 if __base__ is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1671 if __config__ is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1672 raise PydanticUserError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1673 'to avoid confusion `__config__` and `__base__` cannot be used together',
1674 code='create-model-config-base',
1675 )
1676 if not isinstance(__base__, tuple): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1677 __base__ = (__base__,) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1678 else:
1679 __base__ = (cast('type[ModelT]', BaseModel),) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1681 __cls_kwargs__ = __cls_kwargs__ or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1683 fields: dict[str, Any] = {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1684 annotations: dict[str, Any] = {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1686 for f_name, f_def in field_definitions.items(): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1687 if isinstance(f_def, tuple): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1688 if len(f_def) != 2: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1689 raise PydanticUserError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1690 f'Field definition for {f_name!r} should a single element representing the type or a two-tuple, the first element '
1691 'being the type and the second element the assigned value (either a default or the `Field()` function).',
1692 code='create-model-field-definitions',
1693 )
1695 annotations[f_name] = f_def[0] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1696 fields[f_name] = f_def[1] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1697 else:
1698 annotations[f_name] = f_def 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1700 if __module__ is None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1701 f = sys._getframe(1) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1702 __module__ = f.f_globals['__name__'] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1704 namespace: dict[str, Any] = {'__annotations__': annotations, '__module__': __module__} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1705 if __doc__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1706 namespace.update({'__doc__': __doc__}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1707 if __validators__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1708 namespace.update(__validators__) 1zmncaBpqgb
1709 namespace.update(fields) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1710 if __config__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1711 namespace['model_config'] = _config.ConfigWrapper(__config__).config_dict 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1712 resolved_bases = types.resolve_bases(__base__) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1713 meta, ns, kwds = types.prepare_class(model_name, resolved_bases, kwds=__cls_kwargs__) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1714 if resolved_bases is not __base__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1715 ns['__orig_bases__'] = __base__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh
1716 namespace.update(ns) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1718 return meta( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh
1719 model_name,
1720 resolved_bases,
1721 namespace,
1722 __pydantic_reset_parent_namespace__=False,
1723 _create_model_module=__module__,
1724 **kwds,
1725 )
1728__getattr__ = getattr_migration(__name__) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh