[Python-checkins] gh-93250: [Enum] Change IntEnum boundary to KEEP for backwards compatibility (GH-93302) (GH-93304)

ethanfurman webhook-mailer at python.org
Fri May 27 18:43:22 EDT 2022


https://github.com/python/cpython/commit/647426d4fa272da33269a9c183f3949a3477202d
commit: 647426d4fa272da33269a9c183f3949a3477202d
branch: 3.11
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: ethanfurman <ethan at stoneleaf.us>
date: 2022-05-27T15:43:13-07:00
summary:

gh-93250: [Enum] Change IntEnum boundary to KEEP for backwards compatibility (GH-93302) (GH-93304)

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.
(cherry picked from commit 70cfe56cafb2b549983f63d5d1a54654fe63c15c)

Co-authored-by: Ethan Furman <ethan at stoneleaf.us>

files:
M Lib/enum.py
M Lib/test/test_enum.py

diff --git a/Lib/enum.py b/Lib/enum.py
index 4a21226f0193f..fe521b1018d48 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -1575,7 +1575,7 @@ def __invert__(self):
     __rxor__ = __xor__
 
 
-class IntFlag(int, ReprEnum, Flag, boundary=EJECT):
+class IntFlag(int, ReprEnum, Flag, boundary=KEEP):
     """
     Support for integer-based Flags
     """
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index c9ed08397d77c..56cebfea3f1ba 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -3349,7 +3349,10 @@ def test_invert(self):
         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
@@ -3368,7 +3371,6 @@ class Space(IntFlag, boundary=EJECT):
             EIGHT = 8
         self.assertIs(Space._boundary_, EJECT)
         #
-        #
         class Bizarre(IntFlag, boundary=KEEP):
             b = 3
             c = 4
@@ -3385,6 +3387,12 @@ class Bizarre(IntFlag, boundary=KEEP):
         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



More information about the Python-checkins mailing list