From 27682d2698cefb9edabffd14290123f439a84790 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Sun, 4 Sep 2016 11:39:01 -0700 Subject: issue23591: more docs; slight change to repr --- Doc/library/enum.rst | 13 ++++++++++++- Lib/enum.py | 13 +++++-------- Lib/test/test_enum.py | 12 ++++++------ 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 7a5bb5f..ffc85fe 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -574,7 +574,7 @@ It is also possible to name the combinations:: >>> Perm.RWX >>> ~Perm.RWX - + Another important difference between :class:`IntFlag` and :class:`Enum` is that if no flags are set (the value is 0), its boolean evaluation is :data:`False`:: @@ -615,6 +615,17 @@ flags being set, the boolean evaluation is :data:`False`:: >>> bool(Color.red & Color.green) False +Individual flags should have values that are powers of two (1, 2, 4, 8, ...), +while combinations of flags won't:: + + >>> class Color(Flag): + ... red = 1 + ... blue = 2 + ... green = 4 + ... white = 7 + ... # or + ... # white = red | blue | green + Giving a name to the "no flags set" condition does not change its boolean value:: diff --git a/Lib/enum.py b/Lib/enum.py index 1e028a3..6a18999 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -692,14 +692,11 @@ class Flag(Enum): if self._name_ is not None: return '<%s.%s: %r>' % (cls.__name__, self._name_, self._value_) members = self._decompose_() - if len(members) == 1 and members[0]._name_ is None: - return '<%s: %r>' % (cls.__name__, members[0]._value_) - else: - return '<%s.%s: %r>' % ( - cls.__name__, - '|'.join([str(m._name_ or m._value_) for m in members]), - self._value_, - ) + return '<%s.%s: %r>' % ( + cls.__name__, + '|'.join([str(m._name_ or m._value_) for m in members]), + self._value_, + ) def __str__(self): cls = self.__class__ diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index cf704ed..698fd30 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1688,12 +1688,12 @@ class TestFlag(unittest.TestCase): self.assertEqual(repr(Perm.X), '') self.assertEqual(repr(Perm.R | Perm.W), '') self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '') - self.assertEqual(repr(Perm(0)), '') + self.assertEqual(repr(Perm(0)), '') self.assertEqual(repr(~Perm.R), '') self.assertEqual(repr(~Perm.W), '') self.assertEqual(repr(~Perm.X), '') self.assertEqual(repr(~(Perm.R | Perm.W)), '') - self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '') + self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '') self.assertEqual(repr(Perm(~0)), '') Open = self.Open @@ -1933,13 +1933,13 @@ class TestIntFlag(unittest.TestCase): self.assertEqual(repr(Perm.R | Perm.W), '') self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '') self.assertEqual(repr(Perm.R | 8), '') - self.assertEqual(repr(Perm(0)), '') - self.assertEqual(repr(Perm(8)), '') + self.assertEqual(repr(Perm(0)), '') + self.assertEqual(repr(Perm(8)), '') self.assertEqual(repr(~Perm.R), '') self.assertEqual(repr(~Perm.W), '') self.assertEqual(repr(~Perm.X), '') self.assertEqual(repr(~(Perm.R | Perm.W)), '') - self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '') + self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '') self.assertEqual(repr(~(Perm.R | 8)), '') self.assertEqual(repr(Perm(~0)), '') self.assertEqual(repr(Perm(~8)), '') @@ -1950,7 +1950,7 @@ class TestIntFlag(unittest.TestCase): self.assertEqual(repr(Open.AC), '') self.assertEqual(repr(Open.RO | Open.CE), '') self.assertEqual(repr(Open.WO | Open.CE), '') - self.assertEqual(repr(Open(4)), '') + self.assertEqual(repr(Open(4)), '') self.assertEqual(repr(~Open.RO), '') self.assertEqual(repr(~Open.WO), '') self.assertEqual(repr(~Open.AC), '') -- cgit v0.12