From 2f7c764f73fe260ae8a5a4f2e9db2209e6862983 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Fri, 2 Oct 2020 10:19:56 -0700 Subject: [PATCH] fix format() behavior for IntFlag --- Lib/enum.py | 2 +- Lib/test/test_enum.py | 14 ++++++++++++++ .../2020-10-02-10-19-49.bpo-41907.wiIEsz.rst | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst diff --git a/Lib/enum.py b/Lib/enum.py index 40ff25b9cdad37..8a837462c53db0 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -653,7 +653,7 @@ def __format__(self, format_spec): # 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) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 3431040f98a726..2cfe6cd532a348 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -585,12 +585,15 @@ def hello(self): 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): @@ -2225,6 +2228,11 @@ def test_repr(self): self.assertEqual(repr(~(Open.RO | Open.CE)), '') self.assertEqual(repr(~(Open.WO | Open.CE)), '') + 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: @@ -2564,6 +2572,7 @@ class Color(IntFlag): 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)) @@ -2643,6 +2652,11 @@ def test_repr(self): self.assertEqual(repr(~(Open.WO | Open.CE)), '') self.assertEqual(repr(Open(~4)), '') + 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 index 00000000000000..aa337b38046e61 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst @@ -0,0 +1 @@ +fix `format()` behavior for `IntFlag`