From a7e96d32e4052f6d4374b8674f86a5faa89adaef Mon Sep 17 00:00:00 2001 From: Kurt McKee Date: Thu, 2 Mar 2023 17:03:25 -0600 Subject: [PATCH] Raise `ValidationError` for unhashable discriminator values Fixes #4773 --- changes/4773-kurtmckee.md | 1 + pydantic/fields.py | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 changes/4773-kurtmckee.md diff --git a/changes/4773-kurtmckee.md b/changes/4773-kurtmckee.md new file mode 100644 index 00000000000..ede0e030f90 --- /dev/null +++ b/changes/4773-kurtmckee.md @@ -0,0 +1 @@ +Raise `ValidationError`, not `ConfigError`, when a discriminator value is unhashable. diff --git a/pydantic/fields.py b/pydantic/fields.py index 12a4ce937df..5102ec38a8e 100644 --- a/pydantic/fields.py +++ b/pydantic/fields.py @@ -1117,15 +1117,18 @@ def _validate_discriminated_union( except (AttributeError, TypeError): return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc) - try: - sub_field = self.sub_fields_mapping[discriminator_value] # type: ignore[index] - except TypeError: + if self.sub_fields_mapping is None: assert cls is not None raise ConfigError( f'field "{self.name}" not yet prepared so type is still a ForwardRef, ' f'you might need to call {cls.__name__}.update_forward_refs().' ) - except KeyError: + + try: + sub_field = self.sub_fields_mapping[discriminator_value] # type: ignore[index] + except (KeyError, TypeError): + # KeyError: `discriminator_value` is not in the dictionary. + # TypeError: `discriminator_value` is unhashable. assert self.sub_fields_mapping is not None return v, ErrorWrapper( InvalidDiscriminator(