]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-132684: [Enum] only call _missing_ in __contains__ for Flags (GH-132790...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 25 Apr 2025 20:30:33 +0000 (22:30 +0200)
committerGitHub <noreply@github.com>
Fri, 25 Apr 2025 20:30:33 +0000 (13:30 -0700)
gh-132684: [Enum] only call _missing_ in __contains__ for Flags (GH-132790)
(cherry picked from commit 22bc953aa9be3039629dd1315f856d2522619412)

Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Lib/enum.py
Lib/test/test_enum.py

index 9cab804115e484ce7a1624efd719afbaeb8a64cf..e9fc1a7fa734658a9833a95d996507b76ece439e 100644 (file)
@@ -750,14 +750,16 @@ class EnumType(type):
         """
         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
index 18193ad2808b21150a1725c841b3bd38836c3be9..73ae53a3694dcaaacb27ba31f5df90c565be1d0b 100644 (file)
@@ -1583,6 +1583,17 @@ class TestSpecial(unittest.TestCase):
         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'