Coverage for pydantic/main.py: 98.09%

546 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-28 10:05 +0000

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 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

8 

9import operator 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

10import sys 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

11import types 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

12import typing 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

13import warnings 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

14from collections.abc import Generator, Mapping 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

15from copy import copy, deepcopy 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

16from functools import cached_property 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

17from typing import ( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

18 TYPE_CHECKING, 

19 Any, 

20 Callable, 

21 ClassVar, 

22 Dict, 

23 Literal, 

24 TypeVar, 

25 Union, 

26 cast, 

27 overload, 

28) 

29 

30import pydantic_core 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

31import typing_extensions 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

32from pydantic_core import PydanticUndefined, ValidationError 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

33from typing_extensions import Self, TypeAlias, Unpack 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

34 

35from . import PydanticDeprecatedSince20, PydanticDeprecatedSince211 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

36from ._internal import ( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

37 _config, 

38 _decorators, 

39 _fields, 

40 _forward_ref, 

41 _generics, 

42 _mock_val_ser, 

43 _model_construction, 

44 _namespace_utils, 

45 _repr, 

46 _typing_extra, 

47 _utils, 

48) 

49from ._migration import getattr_migration 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

50from .aliases import AliasChoices, AliasPath 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

51from .annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

52from .config import ConfigDict 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

53from .errors import PydanticUndefinedAnnotation, PydanticUserError 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

55from .plugin._schema_validator import PluggableSchemaValidator 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

56 

57if TYPE_CHECKING: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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 1r

67else: 

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

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

70 DeprecationWarning = PydanticDeprecatedSince20 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

71 

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

73 

74# Keep these type aliases available at runtime: 

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

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

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

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

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

80 

81_object_setattr = _model_construction.object_setattr 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

82 

83 

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

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

86 error_type = 'frozen_instance' 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

88 error_type = 'frozen_field' 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

89 else: 

90 return 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

91 

92 raise ValidationError.from_exception_data( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

98 model.__dict__[name] = val 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

99 model.__pydantic_fields_set__.add(name) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

100 

101 

102def _private_setattr_handler(model: BaseModel, name: str, val: Any) -> None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

103 if getattr(model, '__pydantic_private__', None) is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

104 # While the attribute should be present at this point, this may not be the case if 

105 # users do unusual stuff with `model_post_init()` (which is where the `__pydantic_private__` 

106 # is initialized, by wrapping the user-defined `model_post_init()`), e.g. if they mock 

107 # the `model_post_init()` call. Ideally we should find a better way to init private attrs. 

108 object.__setattr__(model, '__pydantic_private__', {}) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

109 model.__pydantic_private__[name] = val # pyright: ignore[reportOptionalSubscript] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

110 

111 

112_SIMPLE_SETATTR_HANDLERS: Mapping[str, Callable[[BaseModel, str, Any], None]] = { 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

113 'model_field': _model_field_setattr_handler, 

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

115 'private': _private_setattr_handler, 

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

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

118} 

119 

120 

121class BaseModel(metaclass=_model_construction.ModelMetaclass): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

122 """!!! abstract "Usage Documentation" 

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

124 

125 A base class for creating Pydantic models. 

126 

127 Attributes: 

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

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

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

131 

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

133 __pydantic_core_schema__: The core schema of the model. 

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

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

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

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

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

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

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

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

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

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

144 

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

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

147 

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

149 is set to `'allow'`. 

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

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

152 """ 

153 

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

155 

156 model_config: ClassVar[ConfigDict] = ConfigDict() 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

157 """ 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

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

159 """ 

160 

161 __class_vars__: ClassVar[set[str]] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

162 """The names of the class variables defined on the model.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

163 

164 __private_attributes__: ClassVar[Dict[str, ModelPrivateAttr]] # noqa: UP006 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

165 """Metadata about the private attributes of the model.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

166 

167 __signature__: ClassVar[Signature] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

168 """The synthesized `__init__` [`Signature`][inspect.Signature] of the model.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

169 

170 __pydantic_complete__: ClassVar[bool] = False 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

172 

173 __pydantic_core_schema__: ClassVar[CoreSchema] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

174 """The core schema of the model.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

175 

176 __pydantic_custom_init__: ClassVar[bool] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

177 """Whether the model has a custom `__init__` method.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

178 

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

180 __pydantic_decorators__: ClassVar[_decorators.DecoratorInfos] = _decorators.DecoratorInfos() 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

181 """Metadata containing the decorators defined on the model. 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

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

183 

184 __pydantic_generic_metadata__: ClassVar[_generics.PydanticGenericMetadata] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

185 """Metadata for generic models; contains data used for a similar purpose to 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

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

187 

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

189 """Parent namespace of the model, used for automatic rebuilding of models.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

190 

191 __pydantic_post_init__: ClassVar[None | Literal['model_post_init']] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

193 

194 __pydantic_root_model__: ClassVar[bool] = False 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

195 """Whether the model is a [`RootModel`][pydantic.root_model.RootModel].""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

196 

197 __pydantic_serializer__: ClassVar[SchemaSerializer] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

199 

200 __pydantic_validator__: ClassVar[SchemaValidator | PluggableSchemaValidator] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

202 

203 __pydantic_fields__: ClassVar[Dict[str, FieldInfo]] # noqa: UP006 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

206 """ 

207 

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

209 """`__setattr__` handlers. Memoizing the handlers leads to a dramatic performance improvement in `__setattr__`""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

210 

211 __pydantic_computed_fields__: ClassVar[Dict[str, ComputedFieldInfo]] # noqa: UP006 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

213 

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

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

216 

217 __pydantic_fields_set__: set[str] = _model_construction.NoInitField(init=False) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

218 """The names of fields explicitly set during instantiation.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

219 

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

221 """Values of private attributes set on the model instance.""" 1puqvcladerwxyzmnfghNOJKLMsAtBiobjk

222 

223 if not TYPE_CHECKING: 223 ↛ 241line 223 didn't jump to line 241 because the condition on line 223 was always true1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

224 # Prevent `BaseModel` from being instantiated directly 

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

226 __pydantic_core_schema__ = _mock_val_ser.MockCoreSchema( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

228 code='base-model-instantiated', 

229 ) 

230 __pydantic_validator__ = _mock_val_ser.MockValSer( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

232 val_or_ser='validator', 

233 code='base-model-instantiated', 

234 ) 

235 __pydantic_serializer__ = _mock_val_ser.MockValSer( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

237 val_or_ser='serializer', 

238 code='base-model-instantiated', 

239 ) 

240 

241 __slots__ = '__dict__', '__pydantic_fields_set__', '__pydantic_extra__', '__pydantic_private__' 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

242 

243 def __init__(self, /, **data: Any) -> None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

245 

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

247 validated to form a valid model. 

248 

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

250 """ 

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

252 __tracebackhide__ = True 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

253 validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

254 if self is not validated_self: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

255 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

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

259 stacklevel=2, 

260 ) 

261 

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

263 __init__.__pydantic_base_init__ = True # pyright: ignore[reportFunctionMemberAccess] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

264 

265 @_utils.deprecated_instance_property 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

266 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

267 def model_fields(cls) -> dict[str, FieldInfo]: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

269 

270 !!! warning 

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

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

273 """ 

274 return getattr(cls, '__pydantic_fields__', {}) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

275 

276 @_utils.deprecated_instance_property 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

277 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

278 def model_computed_fields(cls) -> dict[str, ComputedFieldInfo]: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

280 

281 !!! warning 

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

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

284 """ 

285 return getattr(cls, '__pydantic_computed_fields__', {}) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

286 

287 @property 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

289 """Get extra fields set during validation. 

290 

291 Returns: 

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

293 """ 

294 return self.__pydantic_extra__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

295 

296 @property 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

297 def model_fields_set(self) -> set[str]: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

299 

300 Returns: 

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

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

303 """ 

304 return self.__pydantic_fields_set__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

305 

306 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

309 

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

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

312 

313 !!! note 

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

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

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

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

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

319 

320 Args: 

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

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

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

324 values: Trusted or pre-validated data dictionary. 

325 

326 Returns: 

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

328 """ 

329 m = cls.__new__(cls) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

330 fields_values: dict[str, Any] = {} 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

331 fields_set = set() 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

332 

333 for name, field in cls.__pydantic_fields__.items(): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

334 if field.alias is not None and field.alias in values: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

335 fields_values[name] = values.pop(field.alias) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

336 fields_set.add(name) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

337 

338 if (name not in fields_set) and (field.validation_alias is not None): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

339 validation_aliases: list[str | AliasPath] = ( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

340 field.validation_alias.choices 

341 if isinstance(field.validation_alias, AliasChoices) 

342 else [field.validation_alias] 

343 ) 

344 

345 for alias in validation_aliases: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

346 if isinstance(alias, str) and alias in values: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

347 fields_values[name] = values.pop(alias) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

348 fields_set.add(name) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

349 break 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

350 elif isinstance(alias, AliasPath): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

351 value = alias.search_dict_for_path(values) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

352 if value is not PydanticUndefined: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

353 fields_values[name] = value 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

354 fields_set.add(name) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

355 break 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

356 

357 if name not in fields_set: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

358 if name in values: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

359 fields_values[name] = values.pop(name) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

360 fields_set.add(name) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

361 elif not field.is_required(): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

362 fields_values[name] = field.get_default(call_default_factory=True, validated_data=fields_values) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

363 if _fields_set is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

364 _fields_set = fields_set 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

365 

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

367 _object_setattr(m, '__dict__', fields_values) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

368 _object_setattr(m, '__pydantic_fields_set__', _fields_set) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

369 if not cls.__pydantic_root_model__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

370 _object_setattr(m, '__pydantic_extra__', _extra) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

371 

372 if cls.__pydantic_post_init__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

373 m.model_post_init(None) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

374 # update private attributes with values set 

375 if hasattr(m, '__pydantic_private__') and m.__pydantic_private__ is not None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

376 for k, v in values.items(): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

377 if k in m.__private_attributes__: 377 ↛ 376line 377 didn't jump to line 376 because the condition on line 377 was always true1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

378 m.__pydantic_private__[k] = v 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

379 

380 elif not cls.__pydantic_root_model__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

383 _object_setattr(m, '__pydantic_private__', None) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

384 

385 return m 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

386 

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

388 """!!! abstract "Usage Documentation" 

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

390 

391 Returns a copy of the model. 

392 

393 !!! note 

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

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

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

397 

398 Args: 

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

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

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

402 

403 Returns: 

404 New model instance. 

405 """ 

406 copied = self.__deepcopy__() if deep else self.__copy__() 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

407 if update: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

408 if self.model_config.get('extra') == 'allow': 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

409 for k, v in update.items(): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

410 if k in self.__pydantic_fields__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

411 copied.__dict__[k] = v 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

412 else: 

413 if copied.__pydantic_extra__ is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

414 copied.__pydantic_extra__ = {} 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

415 copied.__pydantic_extra__[k] = v 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

416 else: 

417 copied.__dict__.update(update) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

418 copied.__pydantic_fields_set__.update(update.keys()) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

419 return copied 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

420 

421 def model_dump( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

422 self, 

423 *, 

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

425 include: IncEx | None = None, 

426 exclude: IncEx | None = None, 

427 context: Any | None = None, 

428 by_alias: bool | None = None, 

429 exclude_unset: bool = False, 

430 exclude_defaults: bool = False, 

431 exclude_none: bool = False, 

432 round_trip: bool = False, 

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

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

435 serialize_as_any: bool = False, 

436 ) -> dict[str, Any]: 

437 """!!! abstract "Usage Documentation" 

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

439 

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

441 

442 Args: 

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

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

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

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

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

448 context: Additional context to pass to the serializer. 

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

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

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

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

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

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

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

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

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

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

459 

460 Returns: 

461 A dictionary representation of the model. 

462 """ 

463 return self.__pydantic_serializer__.to_python( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

464 self, 

465 mode=mode, 

466 by_alias=by_alias, 

467 include=include, 

468 exclude=exclude, 

469 context=context, 

470 exclude_unset=exclude_unset, 

471 exclude_defaults=exclude_defaults, 

472 exclude_none=exclude_none, 

473 round_trip=round_trip, 

474 warnings=warnings, 

475 fallback=fallback, 

476 serialize_as_any=serialize_as_any, 

477 ) 

478 

479 def model_dump_json( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

480 self, 

481 *, 

482 indent: int | None = None, 

483 include: IncEx | None = None, 

484 exclude: IncEx | None = None, 

485 context: Any | None = None, 

486 by_alias: bool | None = None, 

487 exclude_unset: bool = False, 

488 exclude_defaults: bool = False, 

489 exclude_none: bool = False, 

490 round_trip: bool = False, 

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

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

493 serialize_as_any: bool = False, 

494 ) -> str: 

495 """!!! abstract "Usage Documentation" 

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

497 

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

499 

500 Args: 

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

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

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

504 context: Additional context to pass to the serializer. 

505 by_alias: Whether to serialize using field aliases. 

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

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

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

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

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

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

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

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

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

515 

516 Returns: 

517 A JSON string representation of the model. 

518 """ 

519 return self.__pydantic_serializer__.to_json( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

520 self, 

521 indent=indent, 

522 include=include, 

523 exclude=exclude, 

524 context=context, 

525 by_alias=by_alias, 

526 exclude_unset=exclude_unset, 

527 exclude_defaults=exclude_defaults, 

528 exclude_none=exclude_none, 

529 round_trip=round_trip, 

530 warnings=warnings, 

531 fallback=fallback, 

532 serialize_as_any=serialize_as_any, 

533 ).decode() 

534 

535 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

536 def model_json_schema( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

537 cls, 

538 by_alias: bool = True, 

539 ref_template: str = DEFAULT_REF_TEMPLATE, 

540 schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema, 

541 mode: JsonSchemaMode = 'validation', 

542 ) -> dict[str, Any]: 

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

544 

545 Args: 

546 by_alias: Whether to use attribute aliases or not. 

547 ref_template: The reference template. 

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

549 `GenerateJsonSchema` with your desired modifications 

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

551 

552 Returns: 

553 The JSON schema for the given model class. 

554 """ 

555 return model_json_schema( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

556 cls, by_alias=by_alias, ref_template=ref_template, schema_generator=schema_generator, mode=mode 

557 ) 

558 

559 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

562 

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

564 

565 Args: 

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

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

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

569 

570 Returns: 

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

572 

573 Raises: 

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

575 """ 

576 if not issubclass(cls, typing.Generic): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

578 

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

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

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

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

583 params_component = ', '.join(param_names) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

584 return f'{cls.__name__}[{params_component}]' 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

585 

586 def model_post_init(self, context: Any, /) -> None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

589 """ 

590 pass 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

591 

592 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

593 def model_rebuild( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

594 cls, 

595 *, 

596 force: bool = False, 

597 raise_errors: bool = True, 

598 _parent_namespace_depth: int = 2, 

599 _types_namespace: MappingNamespace | None = None, 

600 ) -> bool | None: 

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

602 

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

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

605 

606 Args: 

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

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

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

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

611 

612 Returns: 

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

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

615 """ 

616 if not force and cls.__pydantic_complete__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

617 return None 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

618 

619 for attr in ('__pydantic_core_schema__', '__pydantic_validator__', '__pydantic_serializer__'): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

620 if attr in cls.__dict__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

623 delattr(cls, attr) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

624 

625 cls.__pydantic_complete__ = False 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

626 

627 if _types_namespace is not None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

628 rebuild_ns = _types_namespace 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

629 elif _parent_namespace_depth > 0: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

631 else: 

632 rebuild_ns = {} 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

633 

634 parent_ns = _model_construction.unpack_lenient_weakvaluedict(cls.__pydantic_parent_namespace__) or {} 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

635 

636 ns_resolver = _namespace_utils.NsResolver( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

638 ) 

639 

640 return _model_construction.complete_model_class( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

641 cls, 

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

643 ns_resolver, 

644 raise_errors=raise_errors, 

645 ) 

646 

647 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

648 def model_validate( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

649 cls, 

650 obj: Any, 

651 *, 

652 strict: bool | None = None, 

653 from_attributes: bool | None = None, 

654 context: Any | None = None, 

655 by_alias: bool | None = None, 

656 by_name: bool | None = None, 

657 ) -> Self: 

658 """Validate a pydantic model instance. 

659 

660 Args: 

661 obj: The object to validate. 

662 strict: Whether to enforce types strictly. 

663 from_attributes: Whether to extract data from object attributes. 

664 context: Additional context to pass to the validator. 

665 by_alias: Whether to use the field's alias when validating against the provided input data. 

666 by_name: Whether to use the field's name when validating against the provided input data. 

667 

668 Raises: 

669 ValidationError: If the object could not be validated. 

670 

671 Returns: 

672 The validated model instance. 

673 """ 

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

675 __tracebackhide__ = True 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

676 

677 if by_alias is False and by_name is not True: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

678 raise PydanticUserError( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

679 'At least one of `by_alias` or `by_name` must be set to True.', 

680 code='validate-by-alias-and-name-false', 

681 ) 

682 

683 return cls.__pydantic_validator__.validate_python( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

684 obj, strict=strict, from_attributes=from_attributes, context=context, by_alias=by_alias, by_name=by_name 

685 ) 

686 

687 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

688 def model_validate_json( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

689 cls, 

690 json_data: str | bytes | bytearray, 

691 *, 

692 strict: bool | None = None, 

693 context: Any | None = None, 

694 by_alias: bool | None = None, 

695 by_name: bool | None = None, 

696 ) -> Self: 

697 """!!! abstract "Usage Documentation" 

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

699 

700 Validate the given JSON data against the Pydantic model. 

701 

702 Args: 

703 json_data: The JSON data to validate. 

704 strict: Whether to enforce types strictly. 

705 context: Extra variables to pass to the validator. 

706 by_alias: Whether to use the field's alias when validating against the provided input data. 

707 by_name: Whether to use the field's name when validating against the provided input data. 

708 

709 Returns: 

710 The validated Pydantic model. 

711 

712 Raises: 

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

714 """ 

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

716 __tracebackhide__ = True 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

717 

718 if by_alias is False and by_name is not True: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

719 raise PydanticUserError( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

720 'At least one of `by_alias` or `by_name` must be set to True.', 

721 code='validate-by-alias-and-name-false', 

722 ) 

723 

724 return cls.__pydantic_validator__.validate_json( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

725 json_data, strict=strict, context=context, by_alias=by_alias, by_name=by_name 

726 ) 

727 

728 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

729 def model_validate_strings( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

730 cls, 

731 obj: Any, 

732 *, 

733 strict: bool | None = None, 

734 context: Any | None = None, 

735 by_alias: bool | None = None, 

736 by_name: bool | None = None, 

737 ) -> Self: 

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

739 

740 Args: 

741 obj: The object containing string data to validate. 

742 strict: Whether to enforce types strictly. 

743 context: Extra variables to pass to the validator. 

744 by_alias: Whether to use the field's alias when validating against the provided input data. 

745 by_name: Whether to use the field's name when validating against the provided input data. 

746 

747 Returns: 

748 The validated Pydantic model. 

749 """ 

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

751 __tracebackhide__ = True 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

752 

753 if by_alias is False and by_name is not True: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

754 raise PydanticUserError( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

755 'At least one of `by_alias` or `by_name` must be set to True.', 

756 code='validate-by-alias-and-name-false', 

757 ) 

758 

759 return cls.__pydantic_validator__.validate_strings( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

760 obj, strict=strict, context=context, by_alias=by_alias, by_name=by_name 

761 ) 

762 

763 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

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

767 # *not* be called if not overridden. 

768 warnings.warn( 

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

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

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

772 'side effects.', 

773 PydanticDeprecatedSince211, 

774 stacklevel=2, 

775 ) 

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

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

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

779 return cls.__pydantic_core_schema__ 

780 

781 return handler(source) 

782 

783 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

784 def __get_pydantic_json_schema__( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

785 cls, 

786 core_schema: CoreSchema, 

787 handler: GetJsonSchemaHandler, 

788 /, 

789 ) -> JsonSchemaValue: 

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

791 

792 Args: 

793 core_schema: A `pydantic-core` CoreSchema. 

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

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

796 or just call the handler with the original schema. 

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

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

799 generation fails. 

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

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

802 for a type. 

803 

804 Returns: 

805 A JSON schema, as a Python object. 

806 """ 

807 return handler(core_schema) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

808 

809 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

810 def __pydantic_init_subclass__(cls, **kwargs: Any) -> None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

813 be present when this is called. 

814 

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

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

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

818 

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

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

821 

822 Args: 

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

824 by pydantic. 

825 """ 

826 pass 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

827 

828 def __class_getitem__( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

831 cached = _generics.get_cached_generic_type_early(cls, typevar_values) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

832 if cached is not None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

833 return cached 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

834 

835 if cls is BaseModel: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

837 if not hasattr(cls, '__parameters__'): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

840 raise TypeError(f'{cls} is not a generic class') 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

841 

842 if not isinstance(typevar_values, tuple): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

843 typevar_values = (typevar_values,) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

844 

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

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

847 typevars_map = _generics.map_generic_model_arguments(cls, typevar_values) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

849 typevar_values = tuple(v for v in typevars_map.values()) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

850 

851 if _utils.all_identical(typevars_map.keys(), typevars_map.values()) and typevars_map: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

853 _generics.set_cached_generic_type(cls, typevar_values, submodel) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

854 else: 

855 parent_args = cls.__pydantic_generic_metadata__['args'] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

856 if not parent_args: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

857 args = typevar_values 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

858 else: 

859 args = tuple(_generics.replace_types(arg, typevars_map) for arg in parent_args) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

860 

861 origin = cls.__pydantic_generic_metadata__['origin'] or cls 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

862 model_name = origin.model_parametrized_name(args) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

863 params = tuple( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

865 ) # use dict as ordered set 

866 

867 with _generics.generic_recursion_self_type(origin, args) as maybe_self_type: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

868 cached = _generics.get_cached_generic_type_late(cls, typevar_values, origin, args) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

869 if cached is not None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

870 return cached 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

871 

872 if maybe_self_type is not None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

873 return maybe_self_type 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

874 

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

876 try: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

877 # depth 2 gets you above this __class_getitem__ call. 

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

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

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

881 # is being parametrized during a forward annotation evaluation. 

882 parent_ns = _typing_extra.parent_frame_namespace(parent_depth=2) or {} 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

883 origin.model_rebuild(_types_namespace=parent_ns) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

884 except PydanticUndefinedAnnotation: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

886 # that could be evaluated later. 

887 pass 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

888 

889 submodel = _generics.create_generic_submodel(model_name, origin, args, params) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

890 

891 _generics.set_cached_generic_type(cls, typevar_values, submodel, origin, args) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

892 

893 return submodel 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

894 

895 def __copy__(self) -> Self: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

897 cls = type(self) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

898 m = cls.__new__(cls) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

899 _object_setattr(m, '__dict__', copy(self.__dict__)) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

900 _object_setattr(m, '__pydantic_extra__', copy(self.__pydantic_extra__)) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

901 _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

902 

903 if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

904 _object_setattr(m, '__pydantic_private__', None) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

905 else: 

906 _object_setattr( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

907 m, 

908 '__pydantic_private__', 

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

910 ) 

911 

912 return m 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

913 

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

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

916 cls = type(self) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

917 m = cls.__new__(cls) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

918 _object_setattr(m, '__dict__', deepcopy(self.__dict__, memo=memo)) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

919 _object_setattr(m, '__pydantic_extra__', deepcopy(self.__pydantic_extra__, memo=memo)) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

921 # and attempting a deepcopy would be marginally slower. 

922 _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

923 

924 if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

925 _object_setattr(m, '__pydantic_private__', None) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

926 else: 

927 _object_setattr( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

928 m, 

929 '__pydantic_private__', 

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

931 ) 

932 

933 return m 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

934 

935 if not TYPE_CHECKING: 935 ↛ 1071line 935 didn't jump to line 1071 because the condition on line 935 was always true1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

938 

939 def __getattr__(self, item: str) -> Any: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

940 private_attributes = object.__getattribute__(self, '__private_attributes__') 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

941 if item in private_attributes: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

942 attribute = private_attributes[item] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

943 if hasattr(attribute, '__get__'): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

944 return attribute.__get__(self, type(self)) # type: ignore 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

945 

946 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

948 return self.__pydantic_private__[item] # type: ignore 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

949 except KeyError as exc: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

951 else: 

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

953 # See `BaseModel.__repr_args__` for more details 

954 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

955 pydantic_extra = object.__getattribute__(self, '__pydantic_extra__') 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

956 except AttributeError: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

957 pydantic_extra = None 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

958 

959 if pydantic_extra: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

960 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

961 return pydantic_extra[item] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

962 except KeyError as exc: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

964 else: 

965 if hasattr(self.__class__, item): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

966 return super().__getattribute__(item) # Raises AttributeError if appropriate 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

967 else: 

968 # this is the current error 

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

970 

971 def __setattr__(self, name: str, value: Any) -> None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

972 if (setattr_handler := self.__pydantic_setattr_handlers__.get(name)) is not None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

973 setattr_handler(self, name, value) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

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

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

978 

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

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

981 

982 Returns: 

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

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

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

986 """ 

987 cls = self.__class__ 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

988 if name in cls.__class_vars__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

989 raise AttributeError( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

992 ) 

993 elif not _fields.is_valid_field_name(name): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

994 if (attribute := cls.__private_attributes__.get(name)) is not None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

995 if hasattr(attribute, '__set__'): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

996 return lambda model, _name, val: attribute.__set__(model, val) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

997 else: 

998 return _SIMPLE_SETATTR_HANDLERS['private'] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

999 else: 

1000 _object_setattr(self, name, value) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1001 return None # Can not return memoized handler with possibly freeform attr names 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1002 

1003 attr = getattr(cls, name, None) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

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

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

1008 if isinstance(attr, cached_property): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1009 return _SIMPLE_SETATTR_HANDLERS['cached_property'] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1010 

1011 _check_frozen(cls, name, value) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1012 

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

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

1015 if isinstance(attr, property): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1016 return lambda model, _name, val: attr.__set__(model, val) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1017 elif cls.model_config.get('validate_assignment'): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1018 return _SIMPLE_SETATTR_HANDLERS['validate_assignment'] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1019 elif name not in cls.__pydantic_fields__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1020 if cls.model_config.get('extra') != 'allow': 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1021 # TODO - matching error 

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

1023 elif attr is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1025 self.__pydantic_extra__[name] = value 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1026 return None # Can not return memoized handler with possibly freeform attr names 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1027 else: 

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

1029 return _SIMPLE_SETATTR_HANDLERS['extra_known'] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1030 else: 

1031 return _SIMPLE_SETATTR_HANDLERS['model_field'] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1032 

1033 def __delattr__(self, item: str) -> Any: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1034 cls = self.__class__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1035 

1036 if item in self.__private_attributes__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1037 attribute = self.__private_attributes__[item] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1038 if hasattr(attribute, '__delete__'): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1039 attribute.__delete__(self) # type: ignore 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1040 return 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1041 

1042 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1044 del self.__pydantic_private__[item] # type: ignore 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1045 return 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1046 except KeyError as exc: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1048 

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

1050 attr = getattr(cls, item, None) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1051 if isinstance(attr, cached_property): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1052 return object.__delattr__(self, item) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1053 

1054 _check_frozen(cls, name=item, value=None) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1055 

1056 if item in self.__pydantic_fields__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1057 object.__delattr__(self, item) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1058 elif self.__pydantic_extra__ is not None and item in self.__pydantic_extra__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1059 del self.__pydantic_extra__[item] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1060 else: 

1061 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1062 object.__delattr__(self, item) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1063 except AttributeError: 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

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

1065 

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

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

1068 def __replace__(self, **changes: Any) -> Self: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1069 return self.model_copy(update=changes) 1adefghbjk

1070 

1071 def __getstate__(self) -> dict[Any, Any]: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1072 private = self.__pydantic_private__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1073 if private: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1075 return { 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1076 '__dict__': self.__dict__, 

1077 '__pydantic_extra__': self.__pydantic_extra__, 

1078 '__pydantic_fields_set__': self.__pydantic_fields_set__, 

1079 '__pydantic_private__': private, 

1080 } 

1081 

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

1083 _object_setattr(self, '__pydantic_fields_set__', state.get('__pydantic_fields_set__', {})) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1084 _object_setattr(self, '__pydantic_extra__', state.get('__pydantic_extra__', {})) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1085 _object_setattr(self, '__pydantic_private__', state.get('__pydantic_private__', {})) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1086 _object_setattr(self, '__dict__', state.get('__dict__', {})) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1087 

1088 if not TYPE_CHECKING: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1089 

1090 def __eq__(self, other: Any) -> bool: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1091 if isinstance(other, BaseModel): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

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

1095 self_type = self.__pydantic_generic_metadata__['origin'] or self.__class__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1096 other_type = other.__pydantic_generic_metadata__['origin'] or other.__class__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1097 

1098 # Perform common checks first 

1099 if not ( 1CDFr

1100 self_type == other_type 

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

1102 and self.__pydantic_extra__ == other.__pydantic_extra__ 

1103 ): 

1104 return False 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1105 

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

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

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

1109 

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

1111 if self.__dict__ == other.__dict__: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1113 return True 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1114 

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

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

1117 model_fields = type(self).__pydantic_fields__.keys() 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1118 if self.__dict__.keys() <= model_fields and other.__dict__.keys() <= model_fields: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1119 return False 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1120 

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

1122 # Resort to costly filtering of the __dict__ objects 

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

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

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

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

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

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

1129 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1130 return getter(self.__dict__) == getter(other.__dict__) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1131 except KeyError: 

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

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

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

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

1136 # in the common case. 

1137 self_fields_proxy = _utils.SafeGetItemProxy(self.__dict__) 

1138 other_fields_proxy = _utils.SafeGetItemProxy(other.__dict__) 

1139 return getter(self_fields_proxy) == getter(other_fields_proxy) 

1140 

1141 # other instance is not a BaseModel 

1142 else: 

1143 return NotImplemented # delegate to the other item in the comparison 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1144 

1145 if TYPE_CHECKING: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1148 # subclass initialization. 

1149 

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

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

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

1153 

1154 ```python 

1155 from pydantic import BaseModel 

1156 

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

1158 ``` 

1159 

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

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

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

1163 

1164 Args: 

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

1166 

1167 Note: 

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

1169 *after* the class is fully initialized. 

1170 """ 

1171 

1172 def __iter__(self) -> TupleGenerator: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1175 extra = self.__pydantic_extra__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1176 if extra: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1177 yield from extra.items() 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1178 

1179 def __repr__(self) -> str: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1180 return f'{self.__repr_name__()}({self.__repr_str__(", ")})' 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1181 

1182 def __repr_args__(self) -> _repr.ReprArgs: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1183 # Eagerly create the repr of computed fields, as this may trigger access of cached properties and as such 

1184 # modify the instance's `__dict__`. If we don't do it now, it could happen when iterating over the `__dict__` 

1185 # below if the instance happens to be referenced in a field, and would modify the `__dict__` size *during* iteration. 

1186 computed_fields_repr_args = [ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1187 (k, getattr(self, k)) for k, v in self.__pydantic_computed_fields__.items() if v.repr 

1188 ] 

1189 

1190 for k, v in self.__dict__.items(): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1191 field = self.__pydantic_fields__.get(k) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1192 if field and field.repr: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1193 if v is not self: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1194 yield k, v 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1195 else: 

1196 yield k, self.__repr_recursion__(v) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

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

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

1201 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1202 pydantic_extra = object.__getattribute__(self, '__pydantic_extra__') 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1203 except AttributeError: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1204 pydantic_extra = None 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1205 

1206 if pydantic_extra is not None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1207 yield from ((k, v) for k, v in pydantic_extra.items()) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1208 yield from computed_fields_repr_args 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1209 

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

1211 __repr_name__ = _repr.Representation.__repr_name__ 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1212 __repr_recursion__ = _repr.Representation.__repr_recursion__ 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1213 __repr_str__ = _repr.Representation.__repr_str__ 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1214 __pretty__ = _repr.Representation.__pretty__ 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1215 __rich_repr__ = _repr.Representation.__rich_repr__ 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1216 

1217 def __str__(self) -> str: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1218 return self.__repr_str__(' ') 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1219 

1220 # ##### Deprecated methods from v1 ##### 

1221 @property 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1222 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1224 ) 

1225 def __fields__(self) -> dict[str, FieldInfo]: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1226 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1228 category=PydanticDeprecatedSince20, 

1229 stacklevel=2, 

1230 ) 

1231 return getattr(type(self), '__pydantic_fields__', {}) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1232 

1233 @property 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1234 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1236 category=None, 

1237 ) 

1238 def __fields_set__(self) -> set[str]: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1239 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1241 category=PydanticDeprecatedSince20, 

1242 stacklevel=2, 

1243 ) 

1244 return self.__pydantic_fields_set__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1245 

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

1247 def dict( # noqa: D102 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1248 self, 

1249 *, 

1250 include: IncEx | None = None, 

1251 exclude: IncEx | None = None, 

1252 by_alias: bool = False, 

1253 exclude_unset: bool = False, 

1254 exclude_defaults: bool = False, 

1255 exclude_none: bool = False, 

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

1257 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1259 category=PydanticDeprecatedSince20, 

1260 stacklevel=2, 

1261 ) 

1262 return self.model_dump( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1263 include=include, 

1264 exclude=exclude, 

1265 by_alias=by_alias, 

1266 exclude_unset=exclude_unset, 

1267 exclude_defaults=exclude_defaults, 

1268 exclude_none=exclude_none, 

1269 ) 

1270 

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

1272 def json( # noqa: D102 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1273 self, 

1274 *, 

1275 include: IncEx | None = None, 

1276 exclude: IncEx | None = None, 

1277 by_alias: bool = False, 

1278 exclude_unset: bool = False, 

1279 exclude_defaults: bool = False, 

1280 exclude_none: bool = False, 

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

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

1283 **dumps_kwargs: Any, 

1284 ) -> str: 

1285 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1287 category=PydanticDeprecatedSince20, 

1288 stacklevel=2, 

1289 ) 

1290 if encoder is not PydanticUndefined: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1292 if models_as_dict is not PydanticUndefined: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1294 if dumps_kwargs: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1295 raise TypeError('`dumps_kwargs` keyword arguments are no longer supported.') 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1296 return self.model_dump_json( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1297 include=include, 

1298 exclude=exclude, 

1299 by_alias=by_alias, 

1300 exclude_unset=exclude_unset, 

1301 exclude_defaults=exclude_defaults, 

1302 exclude_none=exclude_none, 

1303 ) 

1304 

1305 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1308 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1310 category=PydanticDeprecatedSince20, 

1311 stacklevel=2, 

1312 ) 

1313 return cls.model_validate(obj) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1314 

1315 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1316 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1319 category=None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1320 ) 

1321 def parse_raw( # noqa: D102 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1322 cls, 

1323 b: str | bytes, 1cladeFrmnfghJKLMiobjk

1324 *, 

1325 content_type: str | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1326 encoding: str = 'utf8', 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1327 proto: DeprecatedParseProtocol | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1328 allow_pickle: bool = False, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1329 ) -> Self: # pragma: no cover 1cladeFrmnfghJKLMiobjk

1330 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

1333 category=PydanticDeprecatedSince20, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1334 stacklevel=2, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1335 ) 

1336 from .deprecated import parse 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1337 

1338 try: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1339 obj = parse.load_str_bytes( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1340 b, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1341 proto=proto, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1342 content_type=content_type, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1343 encoding=encoding, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1344 allow_pickle=allow_pickle, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1345 ) 

1346 except (ValueError, TypeError) as exc: 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1347 import json 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1348 

1349 # try to match V1 

1350 if isinstance(exc, UnicodeDecodeError): 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1351 type_str = 'value_error.unicodedecode' 

1352 elif isinstance(exc, json.JSONDecodeError): 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1353 type_str = 'value_error.jsondecode' 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1354 elif isinstance(exc, ValueError): 

1355 type_str = 'value_error' 

1356 else: 

1357 type_str = 'type_error' 

1358 

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

1360 error: pydantic_core.InitErrorDetails = { 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

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

1362 'type': pydantic_core.PydanticCustomError(type_str, str(exc)), # type: ignore 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1363 'loc': ('__root__',), 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1364 'input': b, 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1365 } 

1366 raise pydantic_core.ValidationError.from_exception_data(cls.__name__, [error]) 1CDpuqvcladeGHwxyzmnfghEIsAtBiobjk

1367 return cls.model_validate(obj) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1368 

1369 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1370 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1373 category=None, 

1374 ) 

1375 def parse_file( # noqa: D102 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1376 cls, 

1377 path: str | Path, 

1378 *, 

1379 content_type: str | None = None, 

1380 encoding: str = 'utf8', 

1381 proto: DeprecatedParseProtocol | None = None, 

1382 allow_pickle: bool = False, 

1383 ) -> Self: 

1384 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

1387 category=PydanticDeprecatedSince20, 

1388 stacklevel=2, 

1389 ) 

1390 from .deprecated import parse 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1391 

1392 obj = parse.load_file( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1393 path, 

1394 proto=proto, 

1395 content_type=content_type, 

1396 encoding=encoding, 

1397 allow_pickle=allow_pickle, 

1398 ) 

1399 return cls.parse_obj(obj) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1400 

1401 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1402 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1405 category=None, 

1406 ) 

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

1408 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

1411 category=PydanticDeprecatedSince20, 

1412 stacklevel=2, 

1413 ) 

1414 if not cls.model_config.get('from_attributes', None): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1415 raise PydanticUserError( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1417 ) 

1418 return cls.model_validate(obj) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1419 

1420 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1423 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1425 category=PydanticDeprecatedSince20, 

1426 stacklevel=2, 

1427 ) 

1428 return cls.model_construct(_fields_set=_fields_set, **values) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1429 

1430 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1431 'The `copy` method is deprecated; use `model_copy` instead. ' 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1433 category=None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1434 ) 

1435 def copy( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1436 self, 

1437 *, 

1438 include: AbstractSetIntStr | MappingIntStrAny | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1439 exclude: AbstractSetIntStr | MappingIntStrAny | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1440 update: Dict[str, Any] | None = None, # noqa UP006 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1441 deep: bool = False, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1442 ) -> Self: # pragma: no cover 1cladeFrmnfghJKLMiobjk

1443 """Returns a copy of the model. 

1444 

1445 !!! warning "Deprecated" 

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

1447 

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

1449 

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

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

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

1453 copied = self.model_validate(data) 

1454 ``` 

1455 

1456 Args: 

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

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

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

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

1461 

1462 Returns: 

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

1464 """ 

1465 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1466 'The `copy` method is deprecated; use `model_copy` instead. ' 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1468 category=PydanticDeprecatedSince20, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1469 stacklevel=2, 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1470 ) 

1471 from .deprecated import copy_internals 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1472 

1473 values = dict( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1474 copy_internals._iter( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1475 self, to_dict=False, by_alias=False, include=include, exclude=exclude, exclude_unset=False 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1476 ), 

1477 **(update or {}), 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1478 ) 

1479 if self.__pydantic_private__ is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1480 private = None 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1481 else: 

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

1483 

1484 if self.__pydantic_extra__ is None: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1485 extra: dict[str, Any] | None = None 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1486 else: 

1487 extra = self.__pydantic_extra__.copy() 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1488 for k in list(self.__pydantic_extra__): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1489 if k not in values: # k was in the exclude 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1490 extra.pop(k) 

1491 for k in list(values): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1492 if k in self.__pydantic_extra__: # k must have come from extra 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1493 extra[k] = values.pop(k) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1494 

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

1496 if update: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1497 fields_set = self.__pydantic_fields_set__ | update.keys() 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1498 else: 

1499 fields_set = set(self.__pydantic_fields_set__) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1500 

1501 # removing excluded fields from `__pydantic_fields_set__` 

1502 if exclude: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1503 fields_set -= set(exclude) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1504 

1505 return copy_internals._copy_and_set_values(self, values, fields_set, extra, private, deep=deep) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1506 

1507 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1509 def schema( # noqa: D102 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1512 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1514 category=PydanticDeprecatedSince20, 

1515 stacklevel=2, 

1516 ) 

1517 return cls.model_json_schema(by_alias=by_alias, ref_template=ref_template) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1518 

1519 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1520 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1522 category=None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1523 ) 

1524 def schema_json( # noqa: D102 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1525 cls, *, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE, **dumps_kwargs: Any 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1526 ) -> str: # pragma: no cover 1cladeFrmnfghJKLMiobjk

1527 warnings.warn( 

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

1529 category=PydanticDeprecatedSince20, 

1530 stacklevel=2, 

1531 ) 

1532 import json 

1533 

1534 from .deprecated.json import pydantic_encoder 

1535 

1536 return json.dumps( 

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

1538 default=pydantic_encoder, 

1539 **dumps_kwargs, 

1540 ) 

1541 

1542 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1545 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1547 category=PydanticDeprecatedSince20, 

1548 stacklevel=2, 

1549 ) 

1550 return cls.model_validate(value) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1551 

1552 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1553 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1555 category=None, 

1556 ) 

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

1558 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1560 category=PydanticDeprecatedSince20, 

1561 stacklevel=2, 

1562 ) 

1563 if localns: # pragma: no cover 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1565 cls.model_rebuild(force=True) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1566 

1567 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1569 ) 

1570 def _iter(self, *args: Any, **kwargs: Any) -> Any: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1571 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1573 category=PydanticDeprecatedSince20, 

1574 stacklevel=2, 

1575 ) 

1576 from .deprecated import copy_internals 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1577 

1578 return copy_internals._iter(self, *args, **kwargs) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1579 

1580 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1582 category=None, 

1583 ) 

1584 def _copy_and_set_values(self, *args: Any, **kwargs: Any) -> Any: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1585 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1587 category=PydanticDeprecatedSince20, 

1588 stacklevel=2, 

1589 ) 

1590 from .deprecated import copy_internals 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1591 

1592 return copy_internals._copy_and_set_values(self, *args, **kwargs) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1593 

1594 @classmethod 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1595 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1597 category=None, 

1598 ) 

1599 def _get_value(cls, *args: Any, **kwargs: Any) -> Any: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1600 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1602 category=PydanticDeprecatedSince20, 

1603 stacklevel=2, 

1604 ) 

1605 from .deprecated import copy_internals 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1606 

1607 return copy_internals._get_value(cls, *args, **kwargs) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1608 

1609 @typing_extensions.deprecated( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

1611 category=None, 

1612 ) 

1613 def _calculate_keys(self, *args: Any, **kwargs: Any) -> Any: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1614 warnings.warn( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

1616 category=PydanticDeprecatedSince20, 

1617 stacklevel=2, 

1618 ) 

1619 from .deprecated import copy_internals 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1620 

1621 return copy_internals._calculate_keys(self, *args, **kwargs) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1622 

1623 

1624ModelT = TypeVar('ModelT', bound=BaseModel) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1625 

1626 

1627@overload 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1628def create_model( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1629 model_name: str, 1cladeFrmnfghJKLMiobjk

1630 /, 

1631 *, 

1632 __config__: ConfigDict | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1633 __doc__: str | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1634 __base__: None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1635 __module__: str = __name__, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

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

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

1638 **field_definitions: Any | tuple[str, Any], 1cladeFrmnfghJKLMiobjk

1639) -> type[BaseModel]: ... 1cladeFrmnfghJKLMiobjk

1640 

1641 

1642@overload 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1643def create_model( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1644 model_name: str, 1cladeFrmnfghJKLMiobjk

1645 /, 

1646 *, 

1647 __config__: ConfigDict | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1648 __doc__: str | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1649 __base__: type[ModelT] | tuple[type[ModelT], ...], 1cladeFrmnfghJKLMiobjk

1650 __module__: str = __name__, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1651 __validators__: dict[str, Callable[..., Any]] | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1652 __cls_kwargs__: dict[str, Any] | None = None, 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1653 **field_definitions: Any | tuple[str, Any], 1cladeFrmnfghJKLMiobjk

1654) -> type[ModelT]: ... 1cladeFrmnfghJKLMiobjk

1655 

1656 

1657def create_model( # noqa: C901 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1658 model_name: str, 

1659 /, 

1660 *, 

1661 __config__: ConfigDict | None = None, 

1662 __doc__: str | None = None, 

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

1664 __module__: str | None = None, 

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

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

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

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

1669) -> type[ModelT]: 

1670 """!!! abstract "Usage Documentation" 

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

1672 

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

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

1675 

1676 Args: 

1677 model_name: The name of the newly created model. 

1678 __config__: The configuration of the new model. 

1679 __doc__: The docstring of the new model. 

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

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

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

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

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

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

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

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

1688 

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

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

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

1692 

1693 Returns: 

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

1695 

1696 Raises: 

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

1698 """ 

1699 if __base__ is None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1700 __base__ = (cast('type[ModelT]', BaseModel),) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1701 elif not isinstance(__base__, tuple): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1702 __base__ = (__base__,) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1703 

1704 __cls_kwargs__ = __cls_kwargs__ or {} 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1705 

1706 fields: dict[str, Any] = {} 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1707 annotations: dict[str, Any] = {} 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1708 

1709 for f_name, f_def in field_definitions.items(): 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1710 if isinstance(f_def, tuple): 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1711 if len(f_def) != 2: 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1712 raise PydanticUserError( 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

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

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

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

1716 ) 

1717 

1718 annotations[f_name] = f_def[0] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1719 fields[f_name] = f_def[1] 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1720 else: 

1721 annotations[f_name] = f_def 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1722 

1723 if __module__ is None: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1724 f = sys._getframe(1) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1725 __module__ = f.f_globals['__name__'] 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1726 

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

1728 if __doc__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1729 namespace.update({'__doc__': __doc__}) 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1730 if __validators__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1731 namespace.update(__validators__) 1CpqcaEstib

1732 namespace.update(fields) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1733 if __config__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1734 namespace['model_config'] = __config__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1735 resolved_bases = types.resolve_bases(__base__) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1736 meta, ns, kwds = types.prepare_class(model_name, resolved_bases, kwds=__cls_kwargs__) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1737 if resolved_bases is not __base__: 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1738 ns['__orig_bases__'] = __base__ 1CDpuqvcladeFrGHwxyzmnfghEIsAtBiobjk

1739 namespace.update(ns) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1740 

1741 return meta( 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk

1742 model_name, 

1743 resolved_bases, 

1744 namespace, 

1745 __pydantic_reset_parent_namespace__=False, 

1746 _create_model_module=__module__, 

1747 **kwds, 

1748 ) 

1749 

1750 

1751__getattr__ = getattr_migration(__name__) 1CDpuqvcladeFrGHwxyzmnfghPNOJKLMEIsAtBiobjk