8000 Last fixes · pydantic/pydantic@83bdb4c · GitHub
[go: up one dir, main page]

Skip to content

Commit 83bdb4c

Browse files
committed
Last fixes
1 parent 29f7702 commit 83bdb4c

File tree

5 files changed

+14
-21
lines changed

5 files changed

+14
-21
lines changed

pydantic/_internal/_fields.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,7 @@ def rebuild_model_fields(
311311
cls: type[BaseModel],
312312
*,
313313
ns_resolver: NsResolver,
314-
typevars_map: dict[TypeVar, Any],
315-
raise_errors: bool = True,
314+
typevars_map: Mapping[TypeVar, Any],
316315
) -> dict[str, FieldInfo]:
317316
"""Rebuild the (already present) model fields by trying to reevaluate annotations.
318317
@@ -330,17 +329,11 @@ def rebuild_model_fields(
330329
if field_info._complete:
331330
rebuilt_fields[f_name] = field_info
332331
else:
333-
try:
334-
ann = _typing_extra.eval_type(
335-
field_info._original_annotation,
336-
*ns_resolver.types_namespace,
337-
)
338-
ann = _generics.replace_types(ann, typevars_map)
339-
except NameError:
340-
if raise_errors:
341-
raise
342-
else:
343-
return cls.__pydantic_fields__
332+
ann = _typing_extra.eval_type(
333+
field_info._original_annotation,
334+
*ns_resolver.types_namespace,
335+
)
336+
ann = _generics.replace_types(ann, typevars_map)
344337

345338
if (assign := field_info._original_assignment) is PydanticUndefined:
346339
rebuilt_fields[f_name] = FieldInfo_.from_annotation(ann)

pydantic/_internal/_generate_schema.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,6 @@ def _model_schema(self, cls: type[BaseModel]) -> core_schema.CoreSchema:
740740
cls,
741741
ns_resolver=self._ns_resolver,
742742
typevars_map=self._typevars_map or {},
743-
raise_errors=True,
744743
)
745744
except NameError as e:
746745
raise PydanticUndefinedAnnotation.from_name_error(e) from e

pydantic/_internal/_model_construction.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,10 @@ def wrapped_model_post_init(self: BaseModel, context: Any, /) -> None:
226226
k: v.info for k, v in cls.__pydantic_decorators__.computed_fields.items()
227227
}
228228

229-
if config_wrapper.defer_build or not cls.__pydantic_fields_complete__:
229+
if config_wrapper.defer_build:
230+
# TODO we can also stop there if `__pydantic_fields_complete__` is False.
231+
# However, `set_model_fields()` is currently lenient and we don't have access to the `NameError`.
232+
# (which is useful as we can provide the name in the error message: `set_model_mock(cls, e.name)`)
230233
set_model_mocks(cls)
231234
else:
232235
# Any operation that requires accessing the field infos instances should be put inside

pydantic/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,9 +611,9 @@ def model_rebuild(
611611
cls,
612612
ns_resolver=ns_resolver,
613613
typevars_map=typevars_map,
614-
raise_errors=raise_errors,
615614
)
616615
except NameError as e:
616+
_mock_val_ser.set_model_mocks(cls, f'`{e.name}`')
617617
if raise_errors:
618618
raise PydanticUndefinedAnnotation.from_name_error(e) from e
619619

tests/test_forward_ref.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,14 @@ class Bar(BaseModel):
5858
b: 'Foo'
5959

6060
assert module.Bar.__pydantic_complete__ is True
61-
assert repr(module.Bar.model_fields['b']) == 'FieldInfo(annotation=Foo, required=True)'
61+
assert module.Bar.model_fields['b']._complete
6262

6363
# Bar should be complete and ready to use
6464
b = module.Bar(b={'a': {'b': {}}})
6565
assert b.model_dump() == {'b': {'a': {'b': {'a': None}}}}
6666

67-
# model_fields is complete on Foo
68-
assert repr(module.Foo.model_fields['a']) == (
69-
'FieldInfo(annotation=Union[Bar, NoneType], required=False, default=None)'
70-
)
67+
# model_fields is *not* complete on Foo
68+
assert not module.Foo.model_fields['a']._complete
7169

7270
assert module.Foo.__pydantic_complete__ is False
7371
# Foo gets auto-rebuilt during the first attempt at validation

0 commit comments

Comments
 (0)
0