| 229 | @classmethod |
| 230 | @override |
| 231 | def construct( class="cm"># pyright: ignore[reportIncompatibleMethodOverride] |
| 232 | __cls: Type[ModelT], |
| 233 | _fields_set: set[str] | None = None, |
| 234 | **values: object, |
| 235 | ) -> ModelT: |
| 236 | m = __cls.__new__(__cls) |
| 237 | fields_values: dict[str, object] = {} |
| 238 | |
| 239 | config = get_model_config(__cls) |
| 240 | populate_by_name = ( |
| 241 | config.allow_population_by_field_name |
| 242 | if isinstance(config, _ConfigProtocol) |
| 243 | else config.get(class="st">"populate_by_name") |
| 244 | ) |
| 245 | |
| 246 | if _fields_set is None: |
| 247 | _fields_set = set() |
| 248 | |
| 249 | model_fields = get_model_fields(__cls) |
| 250 | for name, field in model_fields.items(): |
| 251 | key = field.alias |
| 252 | if key is None or (key not in values and populate_by_name): |
| 253 | key = name |
| 254 | |
| 255 | if key in values: |
| 256 | fields_values[name] = _construct_field(value=values[key], field=field, key=key) |
| 257 | _fields_set.add(name) |
| 258 | else: |
| 259 | fields_values[name] = field_get_default(field) |
| 260 | |
| 261 | extra_field_type = _get_extra_fields_type(__cls) |
| 262 | |
| 263 | _extra = {} |
| 264 | for key, value in values.items(): |
| 265 | if key not in model_fields: |
| 266 | parsed = construct_type(value=value, type_=extra_field_type) if extra_field_type is not None else value |
| 267 | |
| 268 | if PYDANTIC_V1: |
| 269 | _fields_set.add(key) |
| 270 | fields_values[key] = parsed |
| 271 | else: |
| 272 | _extra[key] = parsed |
| 273 | |
| 274 | object.__setattr__(m, class="st">"__dict__", fields_values) |
| 275 | |
| 276 | if PYDANTIC_V1: |
| 277 | class="cm"># init_private_attributes() does not exist in v2 |
| 278 | m._init_private_attributes() class="cm"># type: ignore |
| 279 | |
| 280 | class="cm"># copied from Pydantic v1's `construct()` method |
| 281 | object.__setattr__(m, class="st">"__fields_set__", _fields_set) |
| 282 | else: |
| 283 | class="cm"># these properties are copied from Pydantic's `model_construct()` method |
| 284 | object.__setattr__(m, class="st">"__pydantic_private__", None) |
| 285 | object.__setattr__(m, class="st">"__pydantic_extra__", _extra) |
| 286 | object.__setattr__(m, class="st">"__pydantic_fields_set__", _fields_set) |
| 287 | |
| 288 | return m |