]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41907: [Enum] fix format() behavior for IntFlag (GH-22497) (GH-23703)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 8 Dec 2020 19:52:24 +0000 (11:52 -0800)
committerGitHub <noreply@github.com>
Tue, 8 Dec 2020 19:52:24 +0000 (11:52 -0800)
(cherry picked from commit 37440eef7f9a0c27e13fc9ce0850574bb00688b0)

Lib/enum.py
Lib/test/test_enum.py
Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst [new file with mode: 0644]

index 3ce205d48fc2aba61e4e25acd22d1a9c3df5cc2b..c277309881eb0fbb05f728e82c2cbfe7fc7cfe97 100644 (file)
@@ -657,7 +657,7 @@ class Enum(metaclass=EnumMeta):
         # the value
 
         # pure Enum branch, or branch with __str__ explicitly overridden
-        str_overridden = type(self).__str__ != Enum.__str__
+        str_overridden = type(self).__str__ not in (Enum.__str__, Flag.__str__)
         if self._member_type_ is object or str_overridden:
             cls = str
             val = str(self)
index cd73d26e63e2294f60e6551dc669e4c2cb8ec6da..ccc2cbe1ec14b50bb0c93171c95df8fbb2344971 100644 (file)
@@ -570,12 +570,15 @@ class TestEnum(unittest.TestCase):
         class Test1Enum(MyMethodEnum, int, MyStrEnum):
             One = 1
             Two = 2
+        self.assertTrue(Test1Enum._member_type_ is int)
         self.assertEqual(str(Test1Enum.One), 'MyStr')
+        self.assertEqual(format(Test1Enum.One, ''), 'MyStr')
         #
         class Test2Enum(MyStrEnum, MyMethodEnum):
             One = 1
             Two = 2
         self.assertEqual(str(Test2Enum.One), 'MyStr')
+        self.assertEqual(format(Test1Enum.One, ''), 'MyStr')
 
     def test_inherited_data_type(self):
         class HexInt(int):
@@ -2170,6 +2173,11 @@ class TestFlag(unittest.TestCase):
         self.assertEqual(repr(~(Open.RO | Open.CE)), '<Open.AC: 3>')
         self.assertEqual(repr(~(Open.WO | Open.CE)), '<Open.RW: 2>')
 
+    def test_format(self):
+        Perm = self.Perm
+        self.assertEqual(format(Perm.R, ''), 'Perm.R')
+        self.assertEqual(format(Perm.R | Perm.X, ''), 'Perm.R|X')
+
     def test_or(self):
         Perm = self.Perm
         for i in Perm:
@@ -2503,6 +2511,7 @@ class TestIntFlag(unittest.TestCase):
 
     def test_type(self):
         Perm = self.Perm
+        self.assertTrue(Perm._member_type_ is int)
         Open = self.Open
         for f in Perm:
             self.assertTrue(isinstance(f, Perm))
@@ -2582,6 +2591,11 @@ class TestIntFlag(unittest.TestCase):
         self.assertEqual(repr(~(Open.WO | Open.CE)), '<Open.RW: -524290>')
         self.assertEqual(repr(Open(~4)), '<Open.CE|AC|RW|WO: -5>')
 
+    def test_format(self):
+        Perm = self.Perm
+        self.assertEqual(format(Perm.R, ''), '4')
+        self.assertEqual(format(Perm.R | Perm.X, ''), '5')
+
     def test_or(self):
         Perm = self.Perm
         for i in Perm:
diff --git a/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst b/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst
new file mode 100644 (file)
index 0000000..aa337b3
--- /dev/null
@@ -0,0 +1 @@
+fix `format()` behavior for `IntFlag`