@@ -9,7 +9,7 @@ use pyo3::PyVisit;
9
9
use super :: { build_validator, BuildValidator , CombinedValidator , DefinitionsBuilder , ValidationState , Validator } ;
10
10
use crate :: build_tools:: py_schema_err;
11
11
use crate :: build_tools:: schema_or_config_same;
12
- use crate :: errors:: { LocItem , ValError , ValResult } ;
12
+ use crate :: errors:: { ErrorTypeDefaults , LocItem , ValError , ValResult } ;
13
13
use crate :: input:: Input ;
14
14
use crate :: py_gc:: PyGcTraverse ;
15
15
use crate :: tools:: SchemaDict ;
@@ -158,6 +158,11 @@ impl Validator for WithDefaultValidator {
158
158
state : & mut ValidationState < ' _ , ' py > ,
159
159
) -> ValResult < PyObject > {
160
160
if input. as_python ( ) . is_some_and ( |py_input| py_input. is ( & self . undefined ) ) {
161
+ if matches ! ( self . default , DefaultType :: DefaultFactory ( _, true ) ) && state. has_field_error {
162
+ // The default factory might use data from fields that failed to validate, and this results
163
+ // in an unhelpul error.
164
+ return Err ( ValError :: new ( ErrorTypeDefaults :: DefaultFactoryNotCalled , input) ) ;
165
+ }
161
166
Ok ( self . default_value ( py, None :: < usize > , state) ?. unwrap ( ) )
162
167
} else {
163
168
match self . validator . validate ( py, input, state) {
0 commit comments