]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-93250: [Enum] Change IntEnum boundary to KEEP for backwards compatibility (GH...
authorEthan Furman <ethan@stoneleaf.us>
Fri, 27 May 2022 22:14:28 +0000 (15:14 -0700)
committerGitHub <noreply@github.com>
Fri, 27 May 2022 22:14:28 +0000 (15:14 -0700)
In previous versions of Python if an IntEnum member was combined with another integer type value using a bit-wise operation, the resulting value would still be the IntEnum type.  This change restores that behavior.

Lib/enum.py
Lib/test/test_enum.py

index 0b97d3d8a68ef092c74c1d2f5559a150aa8ff469..4261b117d9db23d08efc3ec5a05e055b77288c0c 100644 (file)
@@ -1572,7 +1572,7 @@ class Flag(Enum, boundary=STRICT):
     __rxor__ = __xor__
 
 
-class IntFlag(int, ReprEnum, Flag, boundary=EJECT):
+class IntFlag(int, ReprEnum, Flag, boundary=KEEP):
     """
     Support for integer-based Flags
     """
index 44a3912630c32b40e99b78442cf702f85f7cbf59..25b3e2d818929b4b3130fb3a17609861aafdf57e 100644 (file)
@@ -3353,7 +3353,10 @@ class OldTestIntFlag(unittest.TestCase):
         self.assertIs((Open.WO|Open.CE) & ~Open.WO, Open.CE)
 
     def test_boundary(self):
-        self.assertIs(enum.IntFlag._boundary_, EJECT)
+        self.assertIs(enum.IntFlag._boundary_, KEEP)
+        class Simple(IntFlag, boundary=KEEP):
+            SINGLE = 1
+        #
         class Iron(IntFlag, boundary=STRICT):
             ONE = 1
             TWO = 2
@@ -3372,7 +3375,6 @@ class OldTestIntFlag(unittest.TestCase):
             EIGHT = 8
         self.assertIs(Space._boundary_, EJECT)
         #
-        #
         class Bizarre(IntFlag, boundary=KEEP):
             b = 3
             c = 4
@@ -3389,6 +3391,12 @@ class OldTestIntFlag(unittest.TestCase):
         self.assertEqual(list(Bizarre), [Bizarre.c])
         self.assertIs(Bizarre(3), Bizarre.b)
         self.assertIs(Bizarre(6), Bizarre.d)
+        #
+        simple = Simple.SINGLE | Iron.TWO
+        self.assertEqual(simple, 3)
+        self.assertIsInstance(simple, Simple)
+        self.assertEqual(repr(simple), '<Simple.SINGLE|<Iron.TWO: 2>: 3>')
+        self.assertEqual(str(simple), '3')
 
     def test_iter(self):
         Color = self.Color