https://github.com/python/cpython/commit/22bc953aa9be3039629dd1315f856d2522619412
commit: 22bc953aa9be3039629dd1315f856d2522619412
branch: main
author: Ethan Furman <et...@stoneleaf.us>
committer: ethanfurman <et...@stoneleaf.us>
date: 2025-04-24T23:13:54-07:00
summary:

gh-132684: [Enum] only call _missing_ in __contains__ for Flags (GH-132790)

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 b5f3ca7ae111d6..01fecca3e5aac0 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -731,14 +731,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 dde674164f4a52..68cedc666a59ef 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -1569,6 +1569,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

Reply via email to