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