Coverage for pydantic/main.py: 98.11%

550 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-02-13 19:35 +0000

1"""Logic for creating models.""" 

2 

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 

6 

7from __future__ import annotations as _annotations 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

8 

9import operator 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

10import sys 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

11import types 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

12import typing 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

13import warnings 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

14from collections.abc import Generator, Mapping 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

15from copy import copy, deepcopy 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

16from functools import cached_property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

17from typing import ( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

18 TYPE_CHECKING, 

19 Any, 

20 Callable, 

21 ClassVar, 

22 Dict, 

23 Literal, 

24 TypeVar, 

25 Union, 

26 cast, 

27 overload, 

28) 

29 

30import pydantic_core 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

31import typing_extensions 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

32from pydantic_core import PydanticUndefined, ValidationError 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

33from typing_extensions import Self, TypeAlias, Unpack 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

34 

35from . import PydanticDeprecatedSince20, PydanticDeprecatedSince211 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

36from ._internal import ( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

37 _config, 

38 _decorators, 

39 _fields, 

40 _forward_ref, 

41 _generics, 

42 _mock_val_ser, 

43 _model_construction, 

44 _namespace_utils, 

45 _repr, 

46 _typing_extra, 

47 _utils, 

48) 

49from ._migration import getattr_migration 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

50from .aliases import AliasChoices, AliasPath 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

51from .annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

52from .config import ConfigDict 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

53from .errors import PydanticUndefinedAnnotation, PydanticUserError 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

54from .json_schema import DEFAULT_REF_TEMPLATE, GenerateJsonSchema, JsonSchemaMode, JsonSchemaValue, model_json_schema 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

55from .plugin._schema_validator import PluggableSchemaValidator 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

56 

57if TYPE_CHECKING: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

58 from inspect import Signature 

59 from pathlib import Path 

60 

61 from pydantic_core import CoreSchema, SchemaSerializer, SchemaValidator 

62 

63 from ._internal._namespace_utils import MappingNamespace 

64 from ._internal._utils import AbstractSetIntStr, MappingIntStrAny 

65 from .deprecated.parse import Protocol as DeprecatedParseProtocol 

66 from .fields import ComputedFieldInfo, FieldInfo, ModelPrivateAttr 1o

67else: 

68 # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915 

69 # and https://youtrack.jetbrains.com/issue/PY-51428 

70 DeprecationWarning = PydanticDeprecatedSince20 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

71 

72__all__ = 'BaseModel', 'create_model' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

73 

74# Keep these type aliases available at runtime: 

75TupleGenerator: TypeAlias = Generator[tuple[str, Any], None, None] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

76# NOTE: In reality, `bool` should be replaced by `Literal[True]` but mypy fails to correctly apply bidirectional 

77# type inference (e.g. when using `{'a': {'b': True}}`): 

78# NOTE: Keep this type alias in sync with the stub definition in `pydantic-core`: 

79IncEx: TypeAlias = Union[set[int], set[str], Mapping[int, Union['IncEx', bool]], Mapping[str, Union['IncEx', bool]]] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

80 

81_object_setattr = _model_construction.object_setattr 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

82 

83 

84def _check_frozen(model_cls: type[BaseModel], name: str, value: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

85 if model_cls.model_config.get('frozen'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

86 error_type = 'frozen_instance' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

87 elif getattr(model_cls.__pydantic_fields__.get(name), 'frozen', False): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

88 error_type = 'frozen_field' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

89 else: 

90 return 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

91 

92 raise ValidationError.from_exception_data( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

93 model_cls.__name__, [{'type': error_type, 'loc': (name,), 'input': value}] 

94 ) 

95 

96 

97def _model_field_setattr_handler(model: BaseModel, name: str, val: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

98 model.__dict__[name] = val 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

99 model.__pydantic_fields_set__.add(name) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

100 

101 

102_SIMPLE_SETATTR_HANDLERS: Mapping[str, Callable[[BaseModel, str, Any], None]] = { 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

103 'model_field': _model_field_setattr_handler, 

104 'validate_assignment': lambda model, name, val: model.__pydantic_validator__.validate_assignment(model, name, val), # pyright: ignore[reportAssignmentType] 

105 'private': lambda model, name, val: model.__pydantic_private__.__setitem__(name, val), # pyright: ignore[reportOptionalMemberAccess] 

106 'cached_property': lambda model, name, val: model.__dict__.__setitem__(name, val), 

107 'extra_known': lambda model, name, val: _object_setattr(model, name, val), 

108} 

109 

110 

111class BaseModel(metaclass=_model_construction.ModelMetaclass): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

112 """!!! abstract "Usage Documentation" 

113 [Models](../concepts/models.md) 

114 

115 A base class for creating Pydantic models. 

116 

117 Attributes: 

118 __class_vars__: The names of the class variables defined on the model. 

119 __private_attributes__: Metadata about the private attributes of the model. 

120 __signature__: The synthesized `__init__` [`Signature`][inspect.Signature] of the model. 

121 

122 __pydantic_complete__: Whether model building is completed, or if there are still undefined fields. 

123 __pydantic_core_schema__: The core schema of the model. 

124 __pydantic_custom_init__: Whether the model has a custom `__init__` function. 

125 __pydantic_decorators__: Metadata containing the decorators defined on the model. 

126 This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1. 

127 __pydantic_generic_metadata__: Metadata for generic models; contains data used for a similar purpose to 

128 __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these. 

129 __pydantic_parent_namespace__: Parent namespace of the model, used for automatic rebuilding of models. 

130 __pydantic_post_init__: The name of the post-init method for the model, if defined. 

131 __pydantic_root_model__: Whether the model is a [`RootModel`][pydantic.root_model.RootModel]. 

132 __pydantic_serializer__: The `pydantic-core` `SchemaSerializer` used to dump instances of the model. 

133 __pydantic_validator__: The `pydantic-core` `SchemaValidator` used to validate instances of the model. 

134 

135 __pydantic_fields__: A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects. 

136 __pydantic_computed_fields__: A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects. 

137 

138 __pydantic_extra__: A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra] 

139 is set to `'allow'`. 

140 __pydantic_fields_set__: The names of fields explicitly set during instantiation. 

141 __pydantic_private__: Values of private attributes set on the model instance. 

142 """ 

143 

144 # Note: Many of the below class vars are defined in the metaclass, but we define them here for type checking purposes. 

145 

146 model_config: ClassVar[ConfigDict] = ConfigDict() 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

147 """ 1mrnsciadotuvwjkefKLGHIJpxqyglbh

148 Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict]. 

149 """ 

150 

151 __class_vars__: ClassVar[set[str]] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

152 """The names of the class variables defined on the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

153 

154 __private_attributes__: ClassVar[Dict[str, ModelPrivateAttr]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

155 """Metadata about the private attributes of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

156 

157 __signature__: ClassVar[Signature] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

158 """The synthesized `__init__` [`Signature`][inspect.Signature] of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

159 

160 __pydantic_complete__: ClassVar[bool] = False 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

161 """Whether model building is completed, or if there are still undefined fields.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

162 

163 __pydantic_core_schema__: ClassVar[CoreSchema] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

164 """The core schema of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

165 

166 __pydantic_custom_init__: ClassVar[bool] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

167 """Whether the model has a custom `__init__` method.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

168 

169 # Must be set for `GenerateSchema.model_schema` to work for a plain `BaseModel` annotation. 

170 __pydantic_decorators__: ClassVar[_decorators.DecoratorInfos] = _decorators.DecoratorInfos() 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

171 """Metadata containing the decorators defined on the model. 1mrnsciadotuvwjkefKLGHIJpxqyglbh

172 This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1.""" 

173 

174 __pydantic_generic_metadata__: ClassVar[_generics.PydanticGenericMetadata] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

175 """Metadata for generic models; contains data used for a similar purpose to 1mrnsciadotuvwjkefKLGHIJpxqyglbh

176 __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these.""" 

177 

178 __pydantic_parent_namespace__: ClassVar[Dict[str, Any] | None] = None # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

179 """Parent namespace of the model, used for automatic rebuilding of models.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

180 

181 __pydantic_post_init__: ClassVar[None | Literal['model_post_init']] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

182 """The name of the post-init method for the model, if defined.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

183 

184 __pydantic_root_model__: ClassVar[bool] = False 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

185 """Whether the model is a [`RootModel`][pydantic.root_model.RootModel].""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

186 

187 __pydantic_serializer__: ClassVar[SchemaSerializer] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

188 """The `pydantic-core` `SchemaSerializer` used to dump instances of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

189 

190 __pydantic_validator__: ClassVar[SchemaValidator | PluggableSchemaValidator] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

191 """The `pydantic-core` `SchemaValidator` used to validate instances of the model.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

192 

193 __pydantic_fields__: ClassVar[Dict[str, FieldInfo]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

194 """A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects. 1mrnsciadotuvwjkefKLGHIJpxqyglbh

195 This replaces `Model.__fields__` from Pydantic V1. 

196 """ 

197 

198 __pydantic_setattr_handlers__: ClassVar[Dict[str, Callable[[BaseModel, str, Any], None]]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

199 """`__setattr__` handlers. Memoizing the handlers leads to a dramatic performance improvement in `__setattr__`""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

200 

201 __pydantic_computed_fields__: ClassVar[Dict[str, ComputedFieldInfo]] # noqa: UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

202 """A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

203 

204 __pydantic_extra__: dict[str, Any] | None = _model_construction.NoInitField(init=False) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

205 """A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra] is set to `'allow'`.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

206 

207 __pydantic_fields_set__: set[str] = _model_construction.NoInitField(init=False) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

208 """The names of fields explicitly set during instantiation.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

209 

210 __pydantic_private__: dict[str, Any] | None = _model_construction.NoInitField(init=False) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

211 """Values of private attributes set on the model instance.""" 1mrnsciadotuvwjkefKLGHIJpxqyglbh

212 

213 if not TYPE_CHECKING: 213 ↛ 231line 213 didn't jump to line 231 because the condition on line 213 was always true1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

214 # Prevent `BaseModel` from being instantiated directly 

215 # (defined in an `if not TYPE_CHECKING` block for clarity and to avoid type checking errors): 

216 __pydantic_core_schema__ = _mock_val_ser.MockCoreSchema( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

217 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly', 

218 code='base-model-instantiated', 

219 ) 

220 __pydantic_validator__ = _mock_val_ser.MockValSer( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

221 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly', 

222 val_or_ser='validator', 

223 code='base-model-instantiated', 

224 ) 

225 __pydantic_serializer__ = _mock_val_ser.MockValSer( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

226 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly', 

227 val_or_ser='serializer', 

228 code='base-model-instantiated', 

229 ) 

230 

231 __slots__ = '__dict__', '__pydantic_fields_set__', '__pydantic_extra__', '__pydantic_private__' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

232 

233 def __init__(self, /, **data: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

234 """Create a new model by parsing and validating input data from keyword arguments. 

235 

236 Raises [`ValidationError`][pydantic_core.ValidationError] if the input data cannot be 

237 validated to form a valid model. 

238 

239 `self` is explicitly positional-only to allow `self` as a field name. 

240 """ 

241 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks 

242 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

243 validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

244 if self is not validated_self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

245 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

246 'A custom validator is returning a value other than `self`.\n' 

247 "Returning anything other than `self` from a top level model validator isn't supported when validating via `__init__`.\n" 

248 'See the `model_validator` docs (https://docs.pydantic.dev/latest/concepts/validators/#model-validators) for more details.', 

249 stacklevel=2, 

250 ) 

251 

252 # The following line sets a flag that we use to determine when `__init__` gets overridden by the user 

253 __init__.__pydantic_base_init__ = True # pyright: ignore[reportFunctionMemberAccess] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

254 

255 @_utils.deprecated_instance_property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

256 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

257 def model_fields(cls) -> dict[str, FieldInfo]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

258 """A mapping of field names to their respective [`FieldInfo`][pydantic.fields.FieldInfo] instances. 

259 

260 !!! warning 

261 Accessing this attribute from a model instance is deprecated, and will not work in Pydantic V3. 

262 Instead, you should access this attribute from the model class. 

263 """ 

264 return getattr(cls, '__pydantic_fields__', {}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

265 

266 @_utils.deprecated_instance_property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

267 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

268 def model_computed_fields(cls) -> dict[str, ComputedFieldInfo]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

269 """A mapping of computed field names to their respective [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] instances. 

270 

271 !!! warning 

272 Accessing this attribute from a model instance is deprecated, and will not work in Pydantic V3. 

273 Instead, you should access this attribute from the model class. 

274 """ 

275 return getattr(cls, '__pydantic_computed_fields__', {}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

276 

277 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

278 def model_extra(self) -> dict[str, Any] | None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

279 """Get extra fields set during validation. 

280 

281 Returns: 

282 A dictionary of extra fields, or `None` if `config.extra` is not set to `"allow"`. 

283 """ 

284 return self.__pydantic_extra__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

285 

286 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

287 def model_fields_set(self) -> set[str]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

288 """Returns the set of fields that have been explicitly set on this model instance. 

289 

290 Returns: 

291 A set of strings representing the fields that have been set, 

292 i.e. that were not filled from defaults. 

293 """ 

294 return self.__pydantic_fields_set__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

295 

296 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

297 def model_construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: # noqa: C901 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

298 """Creates a new instance of the `Model` class with validated data. 

299 

300 Creates a new model setting `__dict__` and `__pydantic_fields_set__` from trusted or pre-validated data. 

301 Default values are respected, but no other validation is performed. 

302 

303 !!! note 

304 `model_construct()` generally respects the `model_config.extra` setting on the provided model. 

305 That is, if `model_config.extra == 'allow'`, then all extra passed values are added to the model instance's `__dict__` 

306 and `__pydantic_extra__` fields. If `model_config.extra == 'ignore'` (the default), then all extra passed values are ignored. 

307 Because no validation is performed with a call to `model_construct()`, having `model_config.extra == 'forbid'` does not result in 

308 an error if extra values are passed, but they will be ignored. 

309 

310 Args: 

311 _fields_set: A set of field names that were originally explicitly set during instantiation. If provided, 

312 this is directly used for the [`model_fields_set`][pydantic.BaseModel.model_fields_set] attribute. 

313 Otherwise, the field names from the `values` argument will be used. 

314 values: Trusted or pre-validated data dictionary. 

315 

316 Returns: 

317 A new instance of the `Model` class with validated data. 

318 """ 

319 m = cls.__new__(cls) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

320 fields_values: dict[str, Any] = {} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

321 fields_set = set() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

322 

323 for name, field in cls.__pydantic_fields__.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

324 if field.alias is not None and field.alias in values: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

325 fields_values[name] = values.pop(field.alias) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

326 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

327 

328 if (name not in fields_set) and (field.validation_alias is not None): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

329 validation_aliases: list[str | AliasPath] = ( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

330 field.validation_alias.choices 

331 if isinstance(field.validation_alias, AliasChoices) 

332 else [field.validation_alias] 

333 ) 

334 

335 for alias in validation_aliases: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

336 if isinstance(alias, str) and alias in values: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

337 fields_values[name] = values.pop(alias) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

338 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

339 break 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

340 elif isinstance(alias, AliasPath): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

341 value = alias.search_dict_for_path(values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

342 if value is not PydanticUndefined: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

343 fields_values[name] = value 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

344 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

345 break 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

346 

347 if name not in fields_set: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

348 if name in values: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

349 fields_values[name] = values.pop(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

350 fields_set.add(name) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

351 elif not field.is_required(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

352 fields_values[name] = field.get_default(call_default_factory=True, validated_data=fields_values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

353 if _fields_set is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

354 _fields_set = fields_set 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

355 

356 _extra: dict[str, Any] | None = values if cls.model_config.get('extra') == 'allow' else None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

357 _object_setattr(m, '__dict__', fields_values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

358 _object_setattr(m, '__pydantic_fields_set__', _fields_set) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

359 if not cls.__pydantic_root_model__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

360 _object_setattr(m, '__pydantic_extra__', _extra) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

361 

362 if cls.__pydantic_post_init__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

363 m.model_post_init(None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

364 # update private attributes with values set 

365 if hasattr(m, '__pydantic_private__') and m.__pydantic_private__ is not None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

366 for k, v in values.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

367 if k in m.__private_attributes__: 367 ↛ 366line 367 didn't jump to line 366 because the condition on line 367 was always true1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

368 m.__pydantic_private__[k] = v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

369 

370 elif not cls.__pydantic_root_model__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

371 # Note: if there are any private attributes, cls.__pydantic_post_init__ would exist 

372 # Since it doesn't, that means that `__pydantic_private__` should be set to None 

373 _object_setattr(m, '__pydantic_private__', None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

374 

375 return m 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

376 

377 def model_copy(self, *, update: Mapping[str, Any] | None = None, deep: bool = False) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

378 """!!! abstract "Usage Documentation" 

379 [`model_copy`](../concepts/serialization.md#model_copy) 

380 

381 Returns a copy of the model. 

382 

383 !!! note 

384 The underlying instance's [`__dict__`][object.__dict__] attribute is copied. This 

385 might have unexpected side effects if you store anything in it, on top of the model 

386 fields (e.g. the value of [cached properties][functools.cached_property]). 

387 

388 Args: 

389 update: Values to change/add in the new model. Note: the data is not validated 

390 before creating the new model. You should trust this data. 

391 deep: Set to `True` to make a deep copy of the model. 

392 

393 Returns: 

394 New model instance. 

395 """ 

396 copied = self.__deepcopy__() if deep else self.__copy__() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

397 if update: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

398 if self.model_config.get('extra') == 'allow': 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

399 for k, v in update.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

400 if k in self.__pydantic_fields__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

401 copied.__dict__[k] = v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

402 else: 

403 if copied.__pydantic_extra__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

404 copied.__pydantic_extra__ = {} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

405 copied.__pydantic_extra__[k] = v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

406 else: 

407 copied.__dict__.update(update) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

408 copied.__pydantic_fields_set__.update(update.keys()) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

409 return copied 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

410 

411 def model_dump( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

412 self, 

413 *, 

414 mode: Literal['json', 'python'] | str = 'python', 

415 include: IncEx | None = None, 

416 exclude: IncEx | None = None, 

417 context: Any | None = None, 

418 by_alias: bool = False, 

419 exclude_unset: bool = False, 

420 exclude_defaults: bool = False, 

421 exclude_none: bool = False, 

422 round_trip: bool = False, 

423 warnings: bool | Literal['none', 'warn', 'error'] = True, 

424 fallback: Callable[[Any], Any] | None = None, 

425 serialize_as_any: bool = False, 

426 ) -> dict[str, Any]: 

427 """!!! abstract "Usage Documentation" 

428 [`model_dump`](../concepts/serialization.md#modelmodel_dump) 

429 

430 Generate a dictionary representation of the model, optionally specifying which fields to include or exclude. 

431 

432 Args: 

433 mode: The mode in which `to_python` should run. 

434 If mode is 'json', the output will only contain JSON serializable types. 

435 If mode is 'python', the output may contain non-JSON-serializable Python objects. 

436 include: A set of fields to include in the output. 

437 exclude: A set of fields to exclude from the output. 

438 context: Additional context to pass to the serializer. 

439 by_alias: Whether to use the field's alias in the dictionary key if defined. 

440 exclude_unset: Whether to exclude fields that have not been explicitly set. 

441 exclude_defaults: Whether to exclude fields that are set to their default value. 

442 exclude_none: Whether to exclude fields that have a value of `None`. 

443 round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T]. 

444 warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors, 

445 "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError]. 

446 fallback: A function to call when an unknown value is encountered. If not provided, 

447 a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised. 

448 serialize_as_any: Whether to serialize fields with duck-typing serialization behavior. 

449 

450 Returns: 

451 A dictionary representation of the model. 

452 """ 

453 return self.__pydantic_serializer__.to_python( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

454 self, 

455 mode=mode, 

456 by_alias=by_alias, 

457 include=include, 

458 exclude=exclude, 

459 context=context, 

460 exclude_unset=exclude_unset, 

461 exclude_defaults=exclude_defaults, 

462 exclude_none=exclude_none, 

463 round_trip=round_trip, 

464 warnings=warnings, 

465 fallback=fallback, 

466 serialize_as_any=serialize_as_any, 

467 ) 

468 

469 def model_dump_json( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

470 self, 

471 *, 

472 indent: int | None = None, 

473 include: IncEx | None = None, 

474 exclude: IncEx | None = None, 

475 context: Any | None = None, 

476 by_alias: bool = False, 

477 exclude_unset: bool = False, 

478 exclude_defaults: bool = False, 

479 exclude_none: bool = False, 

480 round_trip: bool = False, 

481 warnings: bool | Literal['none', 'warn', 'error'] = True, 

482 fallback: Callable[[Any], Any] | None = None, 

483 serialize_as_any: bool = False, 

484 ) -> str: 

485 """!!! abstract "Usage Documentation" 

486 [`model_dump_json`](../concepts/serialization.md#modelmodel_dump_json) 

487 

488 Generates a JSON representation of the model using Pydantic's `to_json` method. 

489 

490 Args: 

491 indent: Indentation to use in the JSON output. If None is passed, the output will be compact. 

492 include: Field(s) to include in the JSON output. 

493 exclude: Field(s) to exclude from the JSON output. 

494 context: Additional context to pass to the serializer. 

495 by_alias: Whether to serialize using field aliases. 

496 exclude_unset: Whether to exclude fields that have not been explicitly set. 

497 exclude_defaults: Whether to exclude fields that are set to their default value. 

498 exclude_none: Whether to exclude fields that have a value of `None`. 

499 round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T]. 

500 warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors, 

501 "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError]. 

502 fallback: A function to call when an unknown value is encountered. If not provided, 

503 a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised. 

504 serialize_as_any: Whether to serialize fields with duck-typing serialization behavior. 

505 

506 Returns: 

507 A JSON string representation of the model. 

508 """ 

509 return self.__pydantic_serializer__.to_json( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

510 self, 

511 indent=indent, 

512 include=include, 

513 exclude=exclude, 

514 context=context, 

515 by_alias=by_alias, 

516 exclude_unset=exclude_unset, 

517 exclude_defaults=exclude_defaults, 

518 exclude_none=exclude_none, 

519 round_trip=round_trip, 

520 warnings=warnings, 

521 fallback=fallback, 

522 serialize_as_any=serialize_as_any, 

523 ).decode() 

524 

525 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

526 def model_json_schema( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

527 cls, 

528 by_alias: bool = True, 

529 ref_template: str = DEFAULT_REF_TEMPLATE, 

530 schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema, 

531 mode: JsonSchemaMode = 'validation', 

532 ) -> dict[str, Any]: 

533 """Generates a JSON schema for a model class. 

534 

535 Args: 

536 by_alias: Whether to use attribute aliases or not. 

537 ref_template: The reference template. 

538 schema_generator: To override the logic used to generate the JSON schema, as a subclass of 

539 `GenerateJsonSchema` with your desired modifications 

540 mode: The mode in which to generate the schema. 

541 

542 Returns: 

543 The JSON schema for the given model class. 

544 """ 

545 return model_json_schema( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

546 cls, by_alias=by_alias, ref_template=ref_template, schema_generator=schema_generator, mode=mode 

547 ) 

548 

549 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

550 def model_parametrized_name(cls, params: tuple[type[Any], ...]) -> str: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

551 """Compute the class name for parametrizations of generic classes. 

552 

553 This method can be overridden to achieve a custom naming scheme for generic BaseModels. 

554 

555 Args: 

556 params: Tuple of types of the class. Given a generic class 

557 `Model` with 2 type variables and a concrete model `Model[str, int]`, 

558 the value `(str, int)` would be passed to `params`. 

559 

560 Returns: 

561 String representing the new class where `params` are passed to `cls` as type variables. 

562 

563 Raises: 

564 TypeError: Raised when trying to generate concrete names for non-generic models. 

565 """ 

566 if not issubclass(cls, typing.Generic): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

567 raise TypeError('Concrete names should only be generated for generic models.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

568 

569 # Any strings received should represent forward references, so we handle them specially below. 

570 # If we eventually move toward wrapping them in a ForwardRef in __class_getitem__ in the future, 

571 # we may be able to remove this special case. 

572 param_names = [param if isinstance(param, str) else _repr.display_as_type(param) for param in params] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

573 params_component = ', '.join(param_names) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

574 return f'{cls.__name__}[{params_component}]' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

575 

576 def model_post_init(self, context: Any, /) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

577 """Override this method to perform additional initialization after `__init__` and `model_construct`. 

578 This is useful if you want to do some validation that requires the entire model to be initialized. 

579 """ 

580 pass 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

581 

582 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

583 def model_rebuild( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

584 cls, 

585 *, 

586 force: bool = False, 

587 raise_errors: bool = True, 

588 _parent_namespace_depth: int = 2, 

589 _types_namespace: MappingNamespace | None = None, 

590 ) -> bool | None: 

591 """Try to rebuild the pydantic-core schema for the model. 

592 

593 This may be necessary when one of the annotations is a ForwardRef which could not be resolved during 

594 the initial attempt to build the schema, and automatic rebuilding fails. 

595 

596 Args: 

597 force: Whether to force the rebuilding of the model schema, defaults to `False`. 

598 raise_errors: Whether to raise errors, defaults to `True`. 

599 _parent_namespace_depth: The depth level of the parent namespace, defaults to 2. 

600 _types_namespace: The types namespace, defaults to `None`. 

601 

602 Returns: 

603 Returns `None` if the schema is already "complete" and rebuilding was not required. 

604 If rebuilding _was_ required, returns `True` if rebuilding was successful, otherwise `False`. 

605 """ 

606 if not force and cls.__pydantic_complete__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

607 return None 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

608 

609 for attr in ('__pydantic_core_schema__', '__pydantic_validator__', '__pydantic_serializer__'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

610 if attr in cls.__dict__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

611 # Deleting the validator/serializer is necessary as otherwise they can get reused in 

612 # pydantic-core. Same applies for the core schema that can be reused in schema generation. 

613 delattr(cls, attr) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

614 

615 cls.__pydantic_complete__ = False 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

616 

617 if _types_namespace is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

618 rebuild_ns = _types_namespace 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

619 elif _parent_namespace_depth > 0: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

620 rebuild_ns = _typing_extra.parent_frame_namespace(parent_depth=_parent_namespace_depth, force=True) or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

621 else: 

622 rebuild_ns = {} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

623 

624 parent_ns = _model_construction.unpack_lenient_weakvaluedict(cls.__pydantic_parent_namespace__) or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

625 

626 ns_resolver = _namespace_utils.NsResolver( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

627 parent_namespace={**rebuild_ns, **parent_ns}, 

628 ) 

629 

630 if not cls.__pydantic_fields_complete__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

631 typevars_map = _generics.get_model_typevars_map(cls) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

632 try: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

633 cls.__pydantic_fields__ = _fields.rebuild_model_fields( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

634 cls, 

635 ns_resolver=ns_resolver, 

636 typevars_map=typevars_map, 

637 ) 

638 except NameError as e: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

639 exc = PydanticUndefinedAnnotation.from_name_error(e) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

640 _mock_val_ser.set_model_mocks(cls, f'`{exc.name}`') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

641 if raise_errors: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

642 raise exc from e 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

643 

644 if not raise_errors and not cls.__pydantic_fields_complete__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

645 # No need to continue with schema gen, it is guaranteed to fail 

646 return False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

647 

648 assert cls.__pydantic_fields_complete__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

649 

650 return _model_construction.complete_model_class( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

651 cls, 

652 _config.ConfigWrapper(cls.model_config, check=False), 

653 raise_errors=raise_errors, 

654 ns_resolver=ns_resolver, 

655 ) 

656 

657 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

658 def model_validate( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

659 cls, 

660 obj: Any, 

661 *, 

662 strict: bool | None = None, 

663 from_attributes: bool | None = None, 

664 context: Any | None = None, 

665 ) -> Self: 

666 """Validate a pydantic model instance. 

667 

668 Args: 

669 obj: The object to validate. 

670 strict: Whether to enforce types strictly. 

671 from_attributes: Whether to extract data from object attributes. 

672 context: Additional context to pass to the validator. 

673 

674 Raises: 

675 ValidationError: If the object could not be validated. 

676 

677 Returns: 

678 The validated model instance. 

679 """ 

680 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks 

681 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

682 return cls.__pydantic_validator__.validate_python( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

683 obj, strict=strict, from_attributes=from_attributes, context=context 

684 ) 

685 

686 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

687 def model_validate_json( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

688 cls, 

689 json_data: str | bytes | bytearray, 

690 *, 

691 strict: bool | None = None, 

692 context: Any | None = None, 

693 ) -> Self: 

694 """!!! abstract "Usage Documentation" 

695 [JSON Parsing](../concepts/json.md#json-parsing) 

696 

697 Validate the given JSON data against the Pydantic model. 

698 

699 Args: 

700 json_data: The JSON data to validate. 

701 strict: Whether to enforce types strictly. 

702 context: Extra variables to pass to the validator. 

703 

704 Returns: 

705 The validated Pydantic model. 

706 

707 Raises: 

708 ValidationError: If `json_data` is not a JSON string or the object could not be validated. 

709 """ 

710 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks 

711 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

712 return cls.__pydantic_validator__.validate_json(json_data, strict=strict, context=context) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

713 

714 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

715 def model_validate_strings( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

716 cls, 

717 obj: Any, 

718 *, 

719 strict: bool | None = None, 

720 context: Any | None = None, 

721 ) -> Self: 

722 """Validate the given object with string data against the Pydantic model. 

723 

724 Args: 

725 obj: The object containing string data to validate. 

726 strict: Whether to enforce types strictly. 

727 context: Extra variables to pass to the validator. 

728 

729 Returns: 

730 The validated Pydantic model. 

731 """ 

732 # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks 

733 __tracebackhide__ = True 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

734 return cls.__pydantic_validator__.validate_strings(obj, strict=strict, context=context) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

735 

736 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

737 def __get_pydantic_core_schema__(cls, source: type[BaseModel], handler: GetCoreSchemaHandler, /) -> CoreSchema: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

738 # This warning is only emitted when calling `super().__get_pydantic_core_schema__` from a model subclass. 

739 # In the generate schema logic, this method (`BaseModel.__get_pydantic_core_schema__`) is special cased to 

740 # *not* be called if not overridden. 

741 warnings.warn( 

742 'The `__get_pydantic_core_schema__` method of the `BaseModel` class is deprecated. If you are calling ' 

743 '`super().__get_pydantic_core_schema__` when overriding the method on a Pydantic model, consider using ' 

744 '`handler(source)` instead. However, note that overriding this method on models can lead to unexpected ' 

745 'side effects.', 

746 PydanticDeprecatedSince211, 

747 stacklevel=2, 

748 ) 

749 # Logic copied over from `GenerateSchema._model_schema`: 

750 schema = cls.__dict__.get('__pydantic_core_schema__') 

751 if schema is not None and not isinstance(schema, _mock_val_ser.MockCoreSchema): 

752 return cls.__pydantic_core_schema__ 

753 

754 return handler(source) 

755 

756 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

757 def __get_pydantic_json_schema__( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

758 cls, 

759 core_schema: CoreSchema, 

760 handler: GetJsonSchemaHandler, 

761 /, 

762 ) -> JsonSchemaValue: 

763 """Hook into generating the model's JSON schema. 

764 

765 Args: 

766 core_schema: A `pydantic-core` CoreSchema. 

767 You can ignore this argument and call the handler with a new CoreSchema, 

768 wrap this CoreSchema (`{'type': 'nullable', 'schema': current_schema}`), 

769 or just call the handler with the original schema. 

770 handler: Call into Pydantic's internal JSON schema generation. 

771 This will raise a `pydantic.errors.PydanticInvalidForJsonSchema` if JSON schema 

772 generation fails. 

773 Since this gets called by `BaseModel.model_json_schema` you can override the 

774 `schema_generator` argument to that function to change JSON schema generation globally 

775 for a type. 

776 

777 Returns: 

778 A JSON schema, as a Python object. 

779 """ 

780 return handler(core_schema) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

781 

782 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

783 def __pydantic_init_subclass__(cls, **kwargs: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

784 """This is intended to behave just like `__init_subclass__`, but is called by `ModelMetaclass` 

785 only after the class is actually fully initialized. In particular, attributes like `model_fields` will 

786 be present when this is called. 

787 

788 This is necessary because `__init_subclass__` will always be called by `type.__new__`, 

789 and it would require a prohibitively large refactor to the `ModelMetaclass` to ensure that 

790 `type.__new__` was called in such a manner that the class would already be sufficiently initialized. 

791 

792 This will receive the same `kwargs` that would be passed to the standard `__init_subclass__`, namely, 

793 any kwargs passed to the class definition that aren't used internally by pydantic. 

794 

795 Args: 

796 **kwargs: Any keyword arguments passed to the class definition that aren't used internally 

797 by pydantic. 

798 """ 

799 pass 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

800 

801 def __class_getitem__( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

802 cls, typevar_values: type[Any] | tuple[type[Any], ...] 

803 ) -> type[BaseModel] | _forward_ref.PydanticRecursiveRef: 

804 cached = _generics.get_cached_generic_type_early(cls, typevar_values) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

805 if cached is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

806 return cached 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

807 

808 if cls is BaseModel: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

809 raise TypeError('Type parameters should be placed on typing.Generic, not BaseModel') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

810 if not hasattr(cls, '__parameters__'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

811 raise TypeError(f'{cls} cannot be parametrized because it does not inherit from typing.Generic') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

812 if not cls.__pydantic_generic_metadata__['parameters'] and typing.Generic not in cls.__bases__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

813 raise TypeError(f'{cls} is not a generic class') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

814 

815 if not isinstance(typevar_values, tuple): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

816 typevar_values = (typevar_values,) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

817 

818 # For a model `class Model[T, U, V = int](BaseModel): ...` parametrized with `(str, bool)`, 

819 # this gives us `{T: str, U: bool, V: int}`: 

820 typevars_map = _generics.map_generic_model_arguments(cls, typevar_values) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

821 # We also update the provided args to use defaults values (`(str, bool)` becomes `(str, bool, int)`): 

822 typevar_values = tuple(v for v in typevars_map.values()) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

823 

824 if _utils.all_identical(typevars_map.keys(), typevars_map.values()) and typevars_map: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

825 submodel = cls # if arguments are equal to parameters it's the same object 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

826 _generics.set_cached_generic_type(cls, typevar_values, submodel) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

827 else: 

828 parent_args = cls.__pydantic_generic_metadata__['args'] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

829 if not parent_args: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

830 args = typevar_values 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

831 else: 

832 args = tuple(_generics.replace_types(arg, typevars_map) for arg in parent_args) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

833 

834 origin = cls.__pydantic_generic_metadata__['origin'] or cls 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

835 model_name = origin.model_parametrized_name(args) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

836 params = tuple( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

837 {param: None for param in _generics.iter_contained_typevars(typevars_map.values())} 

838 ) # use dict as ordered set 

839 

840 with _generics.generic_recursion_self_type(origin, args) as maybe_self_type: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

841 cached = _generics.get_cached_generic_type_late(cls, typevar_values, origin, args) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

842 if cached is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

843 return cached 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

844 

845 if maybe_self_type is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

846 return maybe_self_type 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

847 

848 # Attempt to rebuild the origin in case new types have been defined 

849 try: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

850 # depth 2 gets you above this __class_getitem__ call. 

851 # Note that we explicitly provide the parent ns, otherwise 

852 # `model_rebuild` will use the parent ns no matter if it is the ns of a module. 

853 # We don't want this here, as this has unexpected effects when a model 

854 # is being parametrized during a forward annotation evaluation. 

855 parent_ns = _typing_extra.parent_frame_namespace(parent_depth=2) or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

856 origin.model_rebuild(_types_namespace=parent_ns) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

857 except PydanticUndefinedAnnotation: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

858 # It's okay if it fails, it just means there are still undefined types 

859 # that could be evaluated later. 

860 pass 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

861 

862 submodel = _generics.create_generic_submodel(model_name, origin, args, params) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

863 

864 # Cache the generated model *only* if not in the process of parametrizing 

865 # another model. In some valid scenarios, we miss the opportunity to cache 

866 # it but in some cases this results in `PydanticRecursiveRef` instances left 

867 # on `FieldInfo` annotations: 

868 if len(_generics.recursively_defined_type_refs()) == 1: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

869 _generics.set_cached_generic_type(cls, typevar_values, submodel, origin, args) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

870 

871 return submodel 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

872 

873 def __copy__(self) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

874 """Returns a shallow copy of the model.""" 

875 cls = type(self) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

876 m = cls.__new__(cls) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

877 _object_setattr(m, '__dict__', copy(self.__dict__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

878 _object_setattr(m, '__pydantic_extra__', copy(self.__pydantic_extra__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

879 _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

880 

881 if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

882 _object_setattr(m, '__pydantic_private__', None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

883 else: 

884 _object_setattr( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

885 m, 

886 '__pydantic_private__', 

887 {k: v for k, v in self.__pydantic_private__.items() if v is not PydanticUndefined}, 

888 ) 

889 

890 return m 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

891 

892 def __deepcopy__(self, memo: dict[int, Any] | None = None) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

893 """Returns a deep copy of the model.""" 

894 cls = type(self) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

895 m = cls.__new__(cls) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

896 _object_setattr(m, '__dict__', deepcopy(self.__dict__, memo=memo)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

897 _object_setattr(m, '__pydantic_extra__', deepcopy(self.__pydantic_extra__, memo=memo)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

898 # This next line doesn't need a deepcopy because __pydantic_fields_set__ is a set[str], 

899 # and attempting a deepcopy would be marginally slower. 

900 _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

901 

902 if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

903 _object_setattr(m, '__pydantic_private__', None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

904 else: 

905 _object_setattr( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

906 m, 

907 '__pydantic_private__', 

908 deepcopy({k: v for k, v in self.__pydantic_private__.items() if v is not PydanticUndefined}, memo=memo), 

909 ) 

910 

911 return m 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

912 

913 if not TYPE_CHECKING: 913 ↛ 1049line 913 didn't jump to line 1049 because the condition on line 913 was always true1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

914 # We put `__getattr__` in a non-TYPE_CHECKING block because otherwise, mypy allows arbitrary attribute access 

915 # The same goes for __setattr__ and __delattr__, see: https://github.com/pydantic/pydantic/issues/8643 

916 

917 def __getattr__(self, item: str) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

918 private_attributes = object.__getattribute__(self, '__private_attributes__') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

919 if item in private_attributes: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

920 attribute = private_attributes[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

921 if hasattr(attribute, '__get__'): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

922 return attribute.__get__(self, type(self)) # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

923 

924 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

925 # Note: self.__pydantic_private__ cannot be None if self.__private_attributes__ has items 

926 return self.__pydantic_private__[item] # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

927 except KeyError as exc: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

928 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') from exc 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

929 else: 

930 # `__pydantic_extra__` can fail to be set if the model is not yet fully initialized. 

931 # See `BaseModel.__repr_args__` for more details 

932 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

933 pydantic_extra = object.__getattribute__(self, '__pydantic_extra__') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

934 except AttributeError: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

935 pydantic_extra = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

936 

937 if pydantic_extra: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

938 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

939 return pydantic_extra[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

940 except KeyError as exc: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

941 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') from exc 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

942 else: 

943 if hasattr(self.__class__, item): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

944 return super().__getattribute__(item) # Raises AttributeError if appropriate 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

945 else: 

946 # this is the current error 

947 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

948 

949 def __setattr__(self, name: str, value: Any) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

950 if (setattr_handler := self.__pydantic_setattr_handlers__.get(name)) is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

951 setattr_handler(self, name, value) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

952 # if None is returned from _setattr_handler, the attribute was set directly 

953 elif (setattr_handler := self._setattr_handler(name, value)) is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

954 setattr_handler(self, name, value) # call here to not memo on possibly unknown fields 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

955 self.__pydantic_setattr_handlers__[name] = setattr_handler # memoize the handler for faster access 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

956 

957 def _setattr_handler(self, name: str, value: Any) -> Callable[[BaseModel, str, Any], None] | None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

958 """Get a handler for setting an attribute on the model instance. 

959 

960 Returns: 

961 A handler for setting an attribute on the model instance. Used for memoization of the handler. 

962 Memoizing the handlers leads to a dramatic performance improvement in `__setattr__` 

963 Returns `None` when memoization is not safe, then the attribute is set directly. 

964 """ 

965 cls = self.__class__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

966 if name in cls.__class_vars__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

967 raise AttributeError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

968 f'{name!r} is a ClassVar of `{cls.__name__}` and cannot be set on an instance. ' 

969 f'If you want to set a value on the class, use `{cls.__name__}.{name} = value`.' 

970 ) 

971 elif not _fields.is_valid_field_name(name): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

972 if (attribute := cls.__private_attributes__.get(name)) is not None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

973 if hasattr(attribute, '__set__'): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

974 return lambda model, _name, val: attribute.__set__(model, val) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

975 else: 

976 return _SIMPLE_SETATTR_HANDLERS['private'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

977 else: 

978 _object_setattr(self, name, value) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

979 return None # Can not return memoized handler with possibly freeform attr names 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

980 

981 attr = getattr(cls, name, None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

982 # NOTE: We currently special case properties and `cached_property`, but we might need 

983 # to generalize this to all data/non-data descriptors at some point. For non-data descriptors 

984 # (such as `cached_property`), it isn't obvious though. `cached_property` caches the value 

985 # to the instance's `__dict__`, but other non-data descriptors might do things differently. 

986 if isinstance(attr, cached_property): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

987 return _SIMPLE_SETATTR_HANDLERS['cached_property'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

988 

989 _check_frozen(cls, name, value) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

990 

991 # We allow properties to be set only on non frozen models for now (to match dataclasses). 

992 # This can be changed if it ever gets requested. 

993 if isinstance(attr, property): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

994 return lambda model, _name, val: attr.__set__(model, val) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

995 elif cls.model_config.get('validate_assignment'): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

996 return _SIMPLE_SETATTR_HANDLERS['validate_assignment'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

997 elif name not in cls.__pydantic_fields__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

998 if cls.model_config.get('extra') != 'allow': 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

999 # TODO - matching error 

1000 raise ValueError(f'"{cls.__name__}" object has no field "{name}"') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1001 elif attr is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1002 # attribute does not exist, so put it in extra 

1003 self.__pydantic_extra__[name] = value 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1004 return None # Can not return memoized handler with possibly freeform attr names 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1005 else: 

1006 # attribute _does_ exist, and was not in extra, so update it 

1007 return _SIMPLE_SETATTR_HANDLERS['extra_known'] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1008 else: 

1009 return _SIMPLE_SETATTR_HANDLERS['model_field'] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1010 

1011 def __delattr__(self, item: str) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1012 cls = self.__class__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1013 

1014 if item in self.__private_attributes__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1015 attribute = self.__private_attributes__[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1016 if hasattr(attribute, '__delete__'): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1017 attribute.__delete__(self) # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1018 return 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1019 

1020 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1021 # Note: self.__pydantic_private__ cannot be None if self.__private_attributes__ has items 

1022 del self.__pydantic_private__[item] # type: ignore 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1023 return 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1024 except KeyError as exc: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1025 raise AttributeError(f'{cls.__name__!r} object has no attribute {item!r}') from exc 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1026 

1027 # Allow cached properties to be deleted (even if the class is frozen): 

1028 attr = getattr(cls, item, None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1029 if isinstance(attr, cached_property): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1030 return object.__delattr__(self, item) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1031 

1032 _check_frozen(cls, name=item, value=None) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1033 

1034 if item in self.__pydantic_fields__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1035 object.__delattr__(self, item) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1036 elif self.__pydantic_extra__ is not None and item in self.__pydantic_extra__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1037 del self.__pydantic_extra__[item] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1038 else: 

1039 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1040 object.__delattr__(self, item) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1041 except AttributeError: 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1042 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1043 

1044 # Because we make use of `@dataclass_transform()`, `__replace__` is already synthesized by 

1045 # type checkers, so we define the implementation in this `if not TYPE_CHECKING:` block: 

1046 def __replace__(self, **changes: Any) -> Self: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1047 return self.model_copy(update=changes) 1adefbh

1048 

1049 def __getstate__(self) -> dict[Any, Any]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1050 private = self.__pydantic_private__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1051 if private: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1052 private = {k: v for k, v in private.items() if v is not PydanticUndefined} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1053 return { 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1054 '__dict__': self.__dict__, 

1055 '__pydantic_extra__': self.__pydantic_extra__, 

1056 '__pydantic_fields_set__': self.__pydantic_fields_set__, 

1057 '__pydantic_private__': private, 

1058 } 

1059 

1060 def __setstate__(self, state: dict[Any, Any]) -> None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1061 _object_setattr(self, '__pydantic_fields_set__', state.get('__pydantic_fields_set__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1062 _object_setattr(self, '__pydantic_extra__', state.get('__pydantic_extra__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1063 _object_setattr(self, '__pydantic_private__', state.get('__pydantic_private__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1064 _object_setattr(self, '__dict__', state.get('__dict__', {})) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1065 

1066 if not TYPE_CHECKING: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1067 

1068 def __eq__(self, other: Any) -> bool: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1069 if isinstance(other, BaseModel): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1070 # When comparing instances of generic types for equality, as long as all field values are equal, 

1071 # only require their generic origin types to be equal, rather than exact type equality. 

1072 # This prevents headaches like MyGeneric(x=1) != MyGeneric[Any](x=1). 

1073 self_type = self.__pydantic_generic_metadata__['origin'] or self.__class__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1074 other_type = other.__pydantic_generic_metadata__['origin'] or other.__class__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1075 

1076 # Perform common checks first 

1077 if not ( 1zACo

1078 self_type == other_type 

1079 and getattr(self, '__pydantic_private__', None) == getattr(other, '__pydantic_private__', None) 

1080 and self.__pydantic_extra__ == other.__pydantic_extra__ 

1081 ): 

1082 return False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1083 

1084 # We only want to compare pydantic fields but ignoring fields is costly. 

1085 # We'll perform a fast check first, and fallback only when needed 

1086 # See GH-7444 and GH-7825 for rationale and a performance benchmark 

1087 

1088 # First, do the fast (and sometimes faulty) __dict__ comparison 

1089 if self.__dict__ == other.__dict__: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1090 # If the check above passes, then pydantic fields are equal, we can return early 

1091 return True 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1092 

1093 # We don't want to trigger unnecessary costly filtering of __dict__ on all unequal objects, so we return 

1094 # early if there are no keys to ignore (we would just return False later on anyway) 

1095 model_fields = type(self).__pydantic_fields__.keys() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1096 if self.__dict__.keys() <= model_fields and other.__dict__.keys() <= model_fields: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1097 return False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1098 

1099 # If we reach here, there are non-pydantic-fields keys, mapped to unequal values, that we need to ignore 

1100 # Resort to costly filtering of the __dict__ objects 

1101 # We use operator.itemgetter because it is much faster than dict comprehensions 

1102 # NOTE: Contrary to standard python class and instances, when the Model class has a default value for an 

1103 # attribute and the model instance doesn't have a corresponding attribute, accessing the missing attribute 

1104 # raises an error in BaseModel.__getattr__ instead of returning the class attribute 

1105 # So we can use operator.itemgetter() instead of operator.attrgetter() 

1106 getter = operator.itemgetter(*model_fields) if model_fields else lambda _: _utils._SENTINEL 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1107 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1108 return getter(self.__dict__) == getter(other.__dict__) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1109 except KeyError: 

1110 # In rare cases (such as when using the deprecated BaseModel.copy() method), 

1111 # the __dict__ may not contain all model fields, which is how we can get here. 

1112 # getter(self.__dict__) is much faster than any 'safe' method that accounts 

1113 # for missing keys, and wrapping it in a `try` doesn't slow things down much 

1114 # in the common case. 

1115 self_fields_proxy = _utils.SafeGetItemProxy(self.__dict__) 

1116 other_fields_proxy = _utils.SafeGetItemProxy(other.__dict__) 

1117 return getter(self_fields_proxy) == getter(other_fields_proxy) 

1118 

1119 # other instance is not a BaseModel 

1120 else: 

1121 return NotImplemented # delegate to the other item in the comparison 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1122 

1123 if TYPE_CHECKING: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1124 # We put `__init_subclass__` in a TYPE_CHECKING block because, even though we want the type-checking benefits 

1125 # described in the signature of `__init_subclass__` below, we don't want to modify the default behavior of 

1126 # subclass initialization. 

1127 

1128 def __init_subclass__(cls, **kwargs: Unpack[ConfigDict]): 

1129 """This signature is included purely to help type-checkers check arguments to class declaration, which 

1130 provides a way to conveniently set model_config key/value pairs. 

1131 

1132 ```python 

1133 from pydantic import BaseModel 

1134 

1135 class MyModel(BaseModel, extra='allow'): ... 

1136 ``` 

1137 

1138 However, this may be deceiving, since the _actual_ calls to `__init_subclass__` will not receive any 

1139 of the config arguments, and will only receive any keyword arguments passed during class initialization 

1140 that are _not_ expected keys in ConfigDict. (This is due to the way `ModelMetaclass.__new__` works.) 

1141 

1142 Args: 

1143 **kwargs: Keyword arguments passed to the class definition, which set model_config 

1144 

1145 Note: 

1146 You may want to override `__pydantic_init_subclass__` instead, which behaves similarly but is called 

1147 *after* the class is fully initialized. 

1148 """ 

1149 

1150 def __iter__(self) -> TupleGenerator: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1151 """So `dict(model)` works.""" 

1152 yield from [(k, v) for (k, v) in self.__dict__.items() if not k.startswith('_')] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1153 extra = self.__pydantic_extra__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1154 if extra: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1155 yield from extra.items() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1156 

1157 def __repr__(self) -> str: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1158 return f'{self.__repr_name__()}({self.__repr_str__(", ")})' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1159 

1160 def __repr_args__(self) -> _repr.ReprArgs: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1161 for k, v in self.__dict__.items(): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1162 field = self.__pydantic_fields__.get(k) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1163 if field and field.repr: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1164 if v is not self: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1165 yield k, v 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1166 else: 

1167 yield k, self.__repr_recursion__(v) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1168 # `__pydantic_extra__` can fail to be set if the model is not yet fully initialized. 

1169 # This can happen if a `ValidationError` is raised during initialization and the instance's 

1170 # repr is generated as part of the exception handling. Therefore, we use `getattr` here 

1171 # with a fallback, even though the type hints indicate the attribute will always be present. 

1172 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1173 pydantic_extra = object.__getattribute__(self, '__pydantic_extra__') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1174 except AttributeError: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1175 pydantic_extra = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1176 

1177 if pydantic_extra is not None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1178 yield from ((k, v) for k, v in pydantic_extra.items()) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1179 yield from ((k, getattr(self, k)) for k, v in self.__pydantic_computed_fields__.items() if v.repr) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1180 

1181 # take logic from `_repr.Representation` without the side effects of inheritance, see #5740 

1182 __repr_name__ = _repr.Representation.__repr_name__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1183 __repr_recursion__ = _repr.Representation.__repr_recursion__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1184 __repr_str__ = _repr.Representation.__repr_str__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1185 __pretty__ = _repr.Representation.__pretty__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1186 __rich_repr__ = _repr.Representation.__rich_repr__ 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1187 

1188 def __str__(self) -> str: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1189 return self.__repr_str__(' ') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1190 

1191 # ##### Deprecated methods from v1 ##### 

1192 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1193 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1194 'The `__fields__` attribute is deprecated, use `model_fields` instead.', category=None 

1195 ) 

1196 def __fields__(self) -> dict[str, FieldInfo]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1197 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1198 'The `__fields__` attribute is deprecated, use `model_fields` instead.', 

1199 category=PydanticDeprecatedSince20, 

1200 stacklevel=2, 

1201 ) 

1202 return getattr(type(self), '__pydantic_fields__', {}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1203 

1204 @property 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1205 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1206 'The `__fields_set__` attribute is deprecated, use `model_fields_set` instead.', 

1207 category=None, 

1208 ) 

1209 def __fields_set__(self) -> set[str]: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1210 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1211 'The `__fields_set__` attribute is deprecated, use `model_fields_set` instead.', 

1212 category=PydanticDeprecatedSince20, 

1213 stacklevel=2, 

1214 ) 

1215 return self.__pydantic_fields_set__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1216 

1217 @typing_extensions.deprecated('The `dict` method is deprecated; use `model_dump` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1218 def dict( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1219 self, 

1220 *, 

1221 include: IncEx | None = None, 

1222 exclude: IncEx | None = None, 

1223 by_alias: bool = False, 

1224 exclude_unset: bool = False, 

1225 exclude_defaults: bool = False, 

1226 exclude_none: bool = False, 

1227 ) -> Dict[str, Any]: # noqa UP006 

1228 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1229 'The `dict` method is deprecated; use `model_dump` instead.', 

1230 category=PydanticDeprecatedSince20, 

1231 stacklevel=2, 

1232 ) 

1233 return self.model_dump( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1234 include=include, 

1235 exclude=exclude, 

1236 by_alias=by_alias, 

1237 exclude_unset=exclude_unset, 

1238 exclude_defaults=exclude_defaults, 

1239 exclude_none=exclude_none, 

1240 ) 

1241 

1242 @typing_extensions.deprecated('The `json` method is deprecated; use `model_dump_json` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1243 def json( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1244 self, 

1245 *, 

1246 include: IncEx | None = None, 

1247 exclude: IncEx | None = None, 

1248 by_alias: bool = False, 

1249 exclude_unset: bool = False, 

1250 exclude_defaults: bool = False, 

1251 exclude_none: bool = False, 

1252 encoder: Callable[[Any], Any] | None = PydanticUndefined, # type: ignore[assignment] 

1253 models_as_dict: bool = PydanticUndefined, # type: ignore[assignment] 

1254 **dumps_kwargs: Any, 

1255 ) -> str: 

1256 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1257 'The `json` method is deprecated; use `model_dump_json` instead.', 

1258 category=PydanticDeprecatedSince20, 

1259 stacklevel=2, 

1260 ) 

1261 if encoder is not PydanticUndefined: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1262 raise TypeError('The `encoder` argument is no longer supported; use field serializers instead.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1263 if models_as_dict is not PydanticUndefined: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1264 raise TypeError('The `models_as_dict` argument is no longer supported; use a model serializer instead.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1265 if dumps_kwargs: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1266 raise TypeError('`dumps_kwargs` keyword arguments are no longer supported.') 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1267 return self.model_dump_json( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1268 include=include, 

1269 exclude=exclude, 

1270 by_alias=by_alias, 

1271 exclude_unset=exclude_unset, 

1272 exclude_defaults=exclude_defaults, 

1273 exclude_none=exclude_none, 

1274 ) 

1275 

1276 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1277 @typing_extensions.deprecated('The `parse_obj` method is deprecated; use `model_validate` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1278 def parse_obj(cls, obj: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1279 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1280 'The `parse_obj` method is deprecated; use `model_validate` instead.', 

1281 category=PydanticDeprecatedSince20, 

1282 stacklevel=2, 

1283 ) 

1284 return cls.model_validate(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1285 

1286 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1287 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1288 'The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, ' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1289 'otherwise load the data then use `model_validate` instead.', 

1290 category=None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1291 ) 

1292 def parse_raw( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1293 cls, 

1294 b: str | bytes, 1ciadCojkefGHIJglbh

1295 *, 

1296 content_type: str | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1297 encoding: str = 'utf8', 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1298 proto: DeprecatedParseProtocol | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1299 allow_pickle: bool = False, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1300 ) -> Self: # pragma: no cover 1ciadCojkefGHIJglbh

1301 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1302 'The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, ' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1303 'otherwise load the data then use `model_validate` instead.', 

1304 category=PydanticDeprecatedSince20, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1305 stacklevel=2, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1306 ) 

1307 from .deprecated import parse 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1308 

1309 try: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1310 obj = parse.load_str_bytes( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1311 b, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1312 proto=proto, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1313 content_type=content_type, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1314 encoding=encoding, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1315 allow_pickle=allow_pickle, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1316 ) 

1317 except (ValueError, TypeError) as exc: 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1318 import json 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1319 

1320 # try to match V1 

1321 if isinstance(exc, UnicodeDecodeError): 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1322 type_str = 'value_error.unicodedecode' 

1323 elif isinstance(exc, json.JSONDecodeError): 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1324 type_str = 'value_error.jsondecode' 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1325 elif isinstance(exc, ValueError): 

1326 type_str = 'value_error' 

1327 else: 

1328 type_str = 'type_error' 

1329 

1330 # ctx is missing here, but since we've added `input` to the error, we're not pretending it's the same 

1331 error: pydantic_core.InitErrorDetails = { 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1332 # The type: ignore on the next line is to ignore the requirement of LiteralString 

1333 'type': pydantic_core.PydanticCustomError(type_str, str(exc)), # type: ignore 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1334 'loc': ('__root__',), 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1335 'input': b, 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1336 } 

1337 raise pydantic_core.ValidationError.from_exception_data(cls.__name__, [error]) 1zAmrnsciadDEtuvwjkefBFpxqyglbh

1338 return cls.model_validate(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1339 

1340 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1341 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1342 'The `parse_file` method is deprecated; load the data from file, then if your data is JSON ' 

1343 'use `model_validate_json`, otherwise `model_validate` instead.', 

1344 category=None, 

1345 ) 

1346 def parse_file( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1347 cls, 

1348 path: str | Path, 

1349 *, 

1350 content_type: str | None = None, 

1351 encoding: str = 'utf8', 

1352 proto: DeprecatedParseProtocol | None = None, 

1353 allow_pickle: bool = False, 

1354 ) -> Self: 

1355 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1356 'The `parse_file` method is deprecated; load the data from file, then if your data is JSON ' 

1357 'use `model_validate_json`, otherwise `model_validate` instead.', 

1358 category=PydanticDeprecatedSince20, 

1359 stacklevel=2, 

1360 ) 

1361 from .deprecated import parse 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1362 

1363 obj = parse.load_file( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1364 path, 

1365 proto=proto, 

1366 content_type=content_type, 

1367 encoding=encoding, 

1368 allow_pickle=allow_pickle, 

1369 ) 

1370 return cls.parse_obj(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1371 

1372 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1373 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1374 'The `from_orm` method is deprecated; set ' 

1375 "`model_config['from_attributes']=True` and use `model_validate` instead.", 

1376 category=None, 

1377 ) 

1378 def from_orm(cls, obj: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1379 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1380 'The `from_orm` method is deprecated; set ' 

1381 "`model_config['from_attributes']=True` and use `model_validate` instead.", 

1382 category=PydanticDeprecatedSince20, 

1383 stacklevel=2, 

1384 ) 

1385 if not cls.model_config.get('from_attributes', None): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1386 raise PydanticUserError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1387 'You must set the config attribute `from_attributes=True` to use from_orm', code=None 

1388 ) 

1389 return cls.model_validate(obj) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1390 

1391 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1392 @typing_extensions.deprecated('The `construct` method is deprecated; use `model_construct` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1393 def construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1394 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1395 'The `construct` method is deprecated; use `model_construct` instead.', 

1396 category=PydanticDeprecatedSince20, 

1397 stacklevel=2, 

1398 ) 

1399 return cls.model_construct(_fields_set=_fields_set, **values) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1400 

1401 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1402 'The `copy` method is deprecated; use `model_copy` instead. ' 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1403 'See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.', 

1404 category=None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1405 ) 

1406 def copy( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1407 self, 

1408 *, 

1409 include: AbstractSetIntStr | MappingIntStrAny | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1410 exclude: AbstractSetIntStr | MappingIntStrAny | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1411 update: Dict[str, Any] | None = None, # noqa UP006 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1412 deep: bool = False, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1413 ) -> Self: # pragma: no cover 1ciadCojkefGHIJglbh

1414 """Returns a copy of the model. 

1415 

1416 !!! warning "Deprecated" 

1417 This method is now deprecated; use `model_copy` instead. 

1418 

1419 If you need `include` or `exclude`, use: 

1420 

1421 ```python {test="skip" lint="skip"} 

1422 data = self.model_dump(include=include, exclude=exclude, round_trip=True) 

1423 data = {**data, **(update or {})} 

1424 copied = self.model_validate(data) 

1425 ``` 

1426 

1427 Args: 

1428 include: Optional set or mapping specifying which fields to include in the copied model. 

1429 exclude: Optional set or mapping specifying which fields to exclude in the copied model. 

1430 update: Optional dictionary of field-value pairs to override field values in the copied model. 

1431 deep: If True, the values of fields that are Pydantic models will be deep-copied. 

1432 

1433 Returns: 

1434 A copy of the model with included, excluded and updated fields as specified. 

1435 """ 

1436 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1437 'The `copy` method is deprecated; use `model_copy` instead. ' 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1438 'See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.', 

1439 category=PydanticDeprecatedSince20, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1440 stacklevel=2, 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1441 ) 

1442 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1443 

1444 values = dict( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1445 copy_internals._iter( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1446 self, to_dict=False, by_alias=False, include=include, exclude=exclude, exclude_unset=False 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1447 ), 

1448 **(update or {}), 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1449 ) 

1450 if self.__pydantic_private__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1451 private = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1452 else: 

1453 private = {k: v for k, v in self.__pydantic_private__.items() if v is not PydanticUndefined} 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1454 

1455 if self.__pydantic_extra__ is None: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1456 extra: dict[str, Any] | None = None 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1457 else: 

1458 extra = self.__pydantic_extra__.copy() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1459 for k in list(self.__pydantic_extra__): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1460 if k not in values: # k was in the exclude 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1461 extra.pop(k) 

1462 for k in list(values): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1463 if k in self.__pydantic_extra__: # k must have come from extra 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1464 extra[k] = values.pop(k) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1465 

1466 # new `__pydantic_fields_set__` can have unset optional fields with a set value in `update` kwarg 

1467 if update: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1468 fields_set = self.__pydantic_fields_set__ | update.keys() 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1469 else: 

1470 fields_set = set(self.__pydantic_fields_set__) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1471 

1472 # removing excluded fields from `__pydantic_fields_set__` 

1473 if exclude: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1474 fields_set -= set(exclude) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1475 

1476 return copy_internals._copy_and_set_values(self, values, fields_set, extra, private, deep=deep) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1477 

1478 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1479 @typing_extensions.deprecated('The `schema` method is deprecated; use `model_json_schema` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1480 def schema( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1481 cls, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE 

1482 ) -> Dict[str, Any]: # noqa UP006 

1483 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1484 'The `schema` method is deprecated; use `model_json_schema` instead.', 

1485 category=PydanticDeprecatedSince20, 

1486 stacklevel=2, 

1487 ) 

1488 return cls.model_json_schema(by_alias=by_alias, ref_template=ref_template) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1489 

1490 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1491 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1492 'The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1493 category=None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1494 ) 

1495 def schema_json( # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1496 cls, *, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE, **dumps_kwargs: Any 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1497 ) -> str: # pragma: no cover 1ciadCojkefGHIJglbh

1498 warnings.warn( 

1499 'The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', 

1500 category=PydanticDeprecatedSince20, 

1501 stacklevel=2, 

1502 ) 

1503 import json 

1504 

1505 from .deprecated.json import pydantic_encoder 

1506 

1507 return json.dumps( 

1508 cls.model_json_schema(by_alias=by_alias, ref_template=ref_template), 

1509 default=pydantic_encoder, 

1510 **dumps_kwargs, 

1511 ) 

1512 

1513 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1514 @typing_extensions.deprecated('The `validate` method is deprecated; use `model_validate` instead.', category=None) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1515 def validate(cls, value: Any) -> Self: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1516 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1517 'The `validate` method is deprecated; use `model_validate` instead.', 

1518 category=PydanticDeprecatedSince20, 

1519 stacklevel=2, 

1520 ) 

1521 return cls.model_validate(value) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1522 

1523 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1524 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1525 'The `update_forward_refs` method is deprecated; use `model_rebuild` instead.', 

1526 category=None, 

1527 ) 

1528 def update_forward_refs(cls, **localns: Any) -> None: # noqa: D102 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1529 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1530 'The `update_forward_refs` method is deprecated; use `model_rebuild` instead.', 

1531 category=PydanticDeprecatedSince20, 

1532 stacklevel=2, 

1533 ) 

1534 if localns: # pragma: no cover 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1535 raise TypeError('`localns` arguments are not longer accepted.') 

1536 cls.model_rebuild(force=True) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1537 

1538 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1539 'The private method `_iter` will be removed and should no longer be used.', category=None 

1540 ) 

1541 def _iter(self, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1542 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1543 'The private method `_iter` will be removed and should no longer be used.', 

1544 category=PydanticDeprecatedSince20, 

1545 stacklevel=2, 

1546 ) 

1547 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1548 

1549 return copy_internals._iter(self, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1550 

1551 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1552 'The private method `_copy_and_set_values` will be removed and should no longer be used.', 

1553 category=None, 

1554 ) 

1555 def _copy_and_set_values(self, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1556 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1557 'The private method `_copy_and_set_values` will be removed and should no longer be used.', 

1558 category=PydanticDeprecatedSince20, 

1559 stacklevel=2, 

1560 ) 

1561 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1562 

1563 return copy_internals._copy_and_set_values(self, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1564 

1565 @classmethod 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1566 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1567 'The private method `_get_value` will be removed and should no longer be used.', 

1568 category=None, 

1569 ) 

1570 def _get_value(cls, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1571 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1572 'The private method `_get_value` will be removed and should no longer be used.', 

1573 category=PydanticDeprecatedSince20, 

1574 stacklevel=2, 

1575 ) 

1576 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1577 

1578 return copy_internals._get_value(cls, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1579 

1580 @typing_extensions.deprecated( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1581 'The private method `_calculate_keys` will be removed and should no longer be used.', 

1582 category=None, 

1583 ) 

1584 def _calculate_keys(self, *args: Any, **kwargs: Any) -> Any: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1585 warnings.warn( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1586 'The private method `_calculate_keys` will be removed and should no longer be used.', 

1587 category=PydanticDeprecatedSince20, 

1588 stacklevel=2, 

1589 ) 

1590 from .deprecated import copy_internals 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1591 

1592 return copy_internals._calculate_keys(self, *args, **kwargs) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1593 

1594 

1595ModelT = TypeVar('ModelT', bound=BaseModel) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1596 

1597 

1598@overload 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1599def create_model( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1600 model_name: str, 1ciadCojkefGHIJglbh

1601 /, 

1602 *, 

1603 __config__: ConfigDict | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1604 __doc__: str | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1605 __base__: None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1606 __module__: str = __name__, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1607 __validators__: dict[str, Callable[..., Any]] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1608 __cls_kwargs__: dict[str, Any] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1609 **field_definitions: Any | tuple[str, Any], 1ciadCojkefGHIJglbh

1610) -> type[BaseModel]: ... 1ciadCojkefGHIJglbh

1611 

1612 

1613@overload 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1614def create_model( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1615 model_name: str, 1ciadCojkefGHIJglbh

1616 /, 

1617 *, 

1618 __config__: ConfigDict | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1619 __doc__: str | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1620 __base__: type[ModelT] | tuple[type[ModelT], ...], 1ciadCojkefGHIJglbh

1621 __module__: str = __name__, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1622 __validators__: dict[str, Callable[..., Any]] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1623 __cls_kwargs__: dict[str, Any] | None = None, 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1624 **field_definitions: Any | tuple[str, Any], 1ciadCojkefGHIJglbh

1625) -> type[ModelT]: ... 1ciadCojkefGHIJglbh

1626 

1627 

1628def create_model( # noqa: C901 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1629 model_name: str, 

1630 /, 

1631 *, 

1632 __config__: ConfigDict | None = None, 

1633 __doc__: str | None = None, 

1634 __base__: type[ModelT] | tuple[type[ModelT], ...] | None = None, 

1635 __module__: str | None = None, 

1636 __validators__: dict[str, Callable[..., Any]] | None = None, 

1637 __cls_kwargs__: dict[str, Any] | None = None, 

1638 # TODO PEP 747: replace `Any` by the TypeForm: 

1639 **field_definitions: Any | tuple[str, Any], 

1640) -> type[ModelT]: 

1641 """!!! abstract "Usage Documentation" 

1642 [Dynamic Model Creation](../concepts/models.md#dynamic-model-creation) 

1643 

1644 Dynamically creates and returns a new Pydantic model, in other words, `create_model` dynamically creates a 

1645 subclass of [`BaseModel`][pydantic.BaseModel]. 

1646 

1647 Args: 

1648 model_name: The name of the newly created model. 

1649 __config__: The configuration of the new model. 

1650 __doc__: The docstring of the new model. 

1651 __base__: The base class or classes for the new model. 

1652 __module__: The name of the module that the model belongs to; 

1653 if `None`, the value is taken from `sys._getframe(1)` 

1654 __validators__: A dictionary of methods that validate fields. The keys are the names of the validation methods to 

1655 be added to the model, and the values are the validation methods themselves. You can read more about functional 

1656 validators [here](https://docs.pydantic.dev/2.9/concepts/validators/#field-validators). 

1657 __cls_kwargs__: A dictionary of keyword arguments for class creation, such as `metaclass`. 

1658 **field_definitions: Field definitions of the new model. Either: 

1659 

1660 - a single element, representing the type annotation of the field. 

1661 - a two-tuple, the first element being the type and the second element the assigned value 

1662 (either a default or the [`Field()`][pydantic.Field] function). 

1663 

1664 Returns: 

1665 The new [model][pydantic.BaseModel]. 

1666 

1667 Raises: 

1668 PydanticUserError: If `__base__` and `__config__` are both passed. 

1669 """ 

1670 if __base__ is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1671 if __config__ is not None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1672 raise PydanticUserError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1673 'to avoid confusion `__config__` and `__base__` cannot be used together', 

1674 code='create-model-config-base', 

1675 ) 

1676 if not isinstance(__base__, tuple): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1677 __base__ = (__base__,) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1678 else: 

1679 __base__ = (cast('type[ModelT]', BaseModel),) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1680 

1681 __cls_kwargs__ = __cls_kwargs__ or {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1682 

1683 fields: dict[str, Any] = {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1684 annotations: dict[str, Any] = {} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1685 

1686 for f_name, f_def in field_definitions.items(): 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1687 if isinstance(f_def, tuple): 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1688 if len(f_def) != 2: 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1689 raise PydanticUserError( 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1690 f'Field definition for {f_name!r} should a single element representing the type or a two-tuple, the first element ' 

1691 'being the type and the second element the assigned value (either a default or the `Field()` function).', 

1692 code='create-model-field-definitions', 

1693 ) 

1694 

1695 annotations[f_name] = f_def[0] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1696 fields[f_name] = f_def[1] 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1697 else: 

1698 annotations[f_name] = f_def 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1699 

1700 if __module__ is None: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1701 f = sys._getframe(1) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1702 __module__ = f.f_globals['__name__'] 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1703 

1704 namespace: dict[str, Any] = {'__annotations__': annotations, '__module__': __module__} 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1705 if __doc__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1706 namespace.update({'__doc__': __doc__}) 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1707 if __validators__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1708 namespace.update(__validators__) 1zmncaBpqgb

1709 namespace.update(fields) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1710 if __config__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1711 namespace['model_config'] = _config.ConfigWrapper(__config__).config_dict 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1712 resolved_bases = types.resolve_bases(__base__) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1713 meta, ns, kwds = types.prepare_class(model_name, resolved_bases, kwds=__cls_kwargs__) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1714 if resolved_bases is not __base__: 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1715 ns['__orig_bases__'] = __base__ 1zAmrnsciadCoDEtuvwjkefBFpxqyglbh

1716 namespace.update(ns) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1717 

1718 return meta( 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh

1719 model_name, 

1720 resolved_bases, 

1721 namespace, 

1722 __pydantic_reset_parent_namespace__=False, 

1723 _create_model_module=__module__, 

1724 **kwds, 

1725 ) 

1726 

1727 

1728__getattr__ = getattr_migration(__name__) 1zAmrnsciadCoDEtuvwjkefMKLGHIJBFpxqyglbh