@@ -9,7 +9,7 @@ use pyo3::PyVisit;
99use super :: { build_validator, BuildValidator , CombinedValidator , DefinitionsBuilder , ValidationState , Validator } ;
1010use crate :: build_tools:: py_schema_err;
1111use crate :: build_tools:: schema_or_config_same;
12- use crate :: errors:: { LocItem , ValError , ValResult } ;
12+ use crate :: errors:: { ErrorTypeDefaults , LocItem , ValError , ValResult } ;
1313use crate :: input:: Input ;
1414use crate :: py_gc:: PyGcTraverse ;
1515use crate :: tools:: SchemaDict ;
@@ -158,6 +158,11 @@ impl Validator for WithDefaultValidator {
158158 state : & mut ValidationState < ' _ , ' py > ,
159159 ) -> ValResult < PyObject > {
160160 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+ }
161166 Ok ( self . default_value ( py, None :: < usize > , state) ?. unwrap ( ) )
162167 } else {
163168 match self . validator . validate ( py, input, state) {
0 commit comments