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

Reply via email to