Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ Bug fixes:
Thanks: user:`T90REAL` for the report and :user:`rstar327` for the PR.
- Fix behavior when passing a dot-delited attribute name to ``partial`` for a key with ``data_key`` set (:pr:`2903`).
Thanks :user:`bysiber` for the PR.

- Fix Enum field by-name lookup to only return actual members (:pr:`2902`).
Thanks :user:`bysiber` for the PR.

4.2.2 (2026-02-04)
------------------
Expand Down
5 changes: 3 additions & 2 deletions src/marshmallow/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -1947,9 +1947,10 @@ def _deserialize(self, value, attr, data, **kwargs) -> _EnumT:
except ValueError as error:
raise self.make_error("unknown", choices=self.choices_text) from error
try:
return getattr(self.enum, val)
except AttributeError as error:
ret = self.enum[val]
except KeyError as error:
raise self.make_error("unknown", choices=self.choices_text) from error
return ret


class Method(Field):
Expand Down
8 changes: 8 additions & 0 deletions tests/test_deserialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -1197,6 +1197,14 @@ def test_enum_field_by_symbol_invalid_value(self):
):
field.deserialize("dummy")

@pytest.mark.parametrize("non_member", ["mro", "__class__", "__members__"])
def test_enum_field_by_symbol_rejects_non_member_attributes(self, non_member):
field = fields.Enum(GenderEnum)
with pytest.raises(
ValidationError, match="Must be one of: male, female, non_binary."
):
field.deserialize(non_member)

def test_enum_field_by_symbol_not_string(self):
field = fields.Enum(GenderEnum)
with pytest.raises(ValidationError, match="Not a valid string."):
Expand Down