diff --git a/src/input/input_python.rs b/src/input/input_python.rs index cd8ecf267..fe688a487 100644 --- a/src/input/input_python.rs +++ b/src/input/input_python.rs @@ -246,10 +246,11 @@ impl<'a> Input<'a> for PyAny { Err(_) => return Err(ValError::new(ErrorTypeDefaults::StringUnicode, self)), }; Ok(s.into()) - } else if coerce_numbers_to_str && { + } else if coerce_numbers_to_str && !PyBool::is_exact_type_of(self) && { let py = self.py(); let decimal_type: Py = get_decimal_type(py); + // only allow int, float, and decimal (not bool) self.is_instance_of::() || self.is_instance_of::() || self.is_instance(decimal_type.as_ref(py)).unwrap_or_default() diff --git a/tests/validators/test_string.py b/tests/validators/test_string.py index acb145a58..cab6e5127 100644 --- a/tests/validators/test_string.py +++ b/tests/validators/test_string.py @@ -277,6 +277,16 @@ def test_coerce_numbers_to_str_disabled_in_strict_mode() -> None: v.validate_json('42') +def test_coerce_numbers_to_str_raises_for_bool() -> None: + config = core_schema.CoreConfig(coerce_numbers_to_str=True) + + v = SchemaValidator(core_schema.str_schema(), config) + with pytest.raises(ValidationError): + v.validate_python(True) + with pytest.raises(ValidationError): + v.validate_json(False) + + @pytest.mark.parametrize( ('number', 'expected_str'), [