https://github.com/python/cpython/commit/08772229c77b1492efc59abde954191744147f9d commit: 08772229c77b1492efc59abde954191744147f9d branch: 3.13 author: Miss Islington (bot) <31488909+miss-isling...@users.noreply.github.com> committer: ethanfurman <et...@stoneleaf.us> date: 2025-04-25T13:30:33-07:00 summary:
[3.13] gh-132684: [Enum] only call _missing_ in __contains__ for Flags (GH-132790) (GH-132896) gh-132684: [Enum] only call _missing_ in __contains__ for Flags (GH-132790) (cherry picked from commit 22bc953aa9be3039629dd1315f856d2522619412) Co-authored-by: Ethan Furman <et...@stoneleaf.us> Co-authored-by: Bénédikt Tran <10796600+picn...@users.noreply.github.com> files: M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 9cab804115e484..e9fc1a7fa73465 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -750,14 +750,16 @@ def __contains__(cls, value): """ if isinstance(value, cls): return True - try: - cls(value) - return True - except ValueError: - return ( - value in cls._unhashable_values_ # both structures are lists - or value in cls._hashable_values_ - ) + if issubclass(cls, Flag): + try: + result = cls._missing_(value) + return isinstance(result, cls) + except ValueError: + pass + return ( + value in cls._unhashable_values_ # both structures are lists + or value in cls._hashable_values_ + ) def __delattr__(cls, attr): # nicer error message when someone tries to delete an attribute diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 18193ad2808b21..73ae53a3694dca 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1583,6 +1583,17 @@ class IntFlag1(IntFlag): self.assertIn(IntEnum1.X, IntFlag1) self.assertIn(IntFlag1.X, IntEnum1) + def test_contains_does_not_call_missing(self): + class AnEnum(Enum): + UNKNOWN = None + LUCKY = 3 + @classmethod + def _missing_(cls, *values): + return cls.UNKNOWN + self.assertTrue(None in AnEnum) + self.assertTrue(3 in AnEnum) + self.assertFalse(7 in AnEnum) + def test_inherited_data_type(self): class HexInt(int): __qualname__ = 'HexInt' _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com