summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEthan Furman <ethan@stoneleaf.us>2016-09-04 18:39:01 (GMT)
committerEthan Furman <ethan@stoneleaf.us>2016-09-04 18:39:01 (GMT)
commit27682d2698cefb9edabffd14290123f439a84790 (patch)
tree18ad8bf4f94d4417bd2b3eaf4fbd27e0b89cb231
parentbce9cbaf98fa92718a4dfb7011f93aca3993b4d4 (diff)
downloadcpython-27682d2698cefb9edabffd14290123f439a84790.zip
cpython-27682d2698cefb9edabffd14290123f439a84790.tar.gz
cpython-27682d2698cefb9edabffd14290123f439a84790.tar.bz2
issue23591: more docs; slight change to repr
-rw-r--r--Doc/library/enum.rst13
-rw-r--r--Lib/enum.py13
-rw-r--r--Lib/test/test_enum.py12
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: 7>
>>> ~Perm.RWX
- <Perm.0: 0>
+ <Perm.-8: -8>
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), '<Perm.X: 1>')
self.assertEqual(repr(Perm.R | Perm.W), '<Perm.R|W: 6>')
self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '<Perm.R|W|X: 7>')
- self.assertEqual(repr(Perm(0)), '<Perm: 0>')
+ self.assertEqual(repr(Perm(0)), '<Perm.0: 0>')
self.assertEqual(repr(~Perm.R), '<Perm.W|X: 3>')
self.assertEqual(repr(~Perm.W), '<Perm.R|X: 5>')
self.assertEqual(repr(~Perm.X), '<Perm.R|W: 6>')
self.assertEqual(repr(~(Perm.R | Perm.W)), '<Perm.X: 1>')
- self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm: 0>')
+ self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm.0: 0>')
self.assertEqual(repr(Perm(~0)), '<Perm.R|W|X: 7>')
Open = self.Open
@@ -1933,13 +1933,13 @@ class TestIntFlag(unittest.TestCase):
self.assertEqual(repr(Perm.R | Perm.W), '<Perm.R|W: 6>')
self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '<Perm.R|W|X: 7>')
self.assertEqual(repr(Perm.R | 8), '<Perm.8|R: 12>')
- self.assertEqual(repr(Perm(0)), '<Perm: 0>')
- self.assertEqual(repr(Perm(8)), '<Perm: 8>')
+ self.assertEqual(repr(Perm(0)), '<Perm.0: 0>')
+ self.assertEqual(repr(Perm(8)), '<Perm.8: 8>')
self.assertEqual(repr(~Perm.R), '<Perm.W|X|-8: -5>')
self.assertEqual(repr(~Perm.W), '<Perm.R|X|-8: -3>')
self.assertEqual(repr(~Perm.X), '<Perm.R|W|-8: -2>')
self.assertEqual(repr(~(Perm.R | Perm.W)), '<Perm.X|-8: -7>')
- self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm: -8>')
+ self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm.-8: -8>')
self.assertEqual(repr(~(Perm.R | 8)), '<Perm.W|X|-16: -13>')
self.assertEqual(repr(Perm(~0)), '<Perm.R|W|X|-8: -1>')
self.assertEqual(repr(Perm(~8)), '<Perm.R|W|X|-16: -9>')
@@ -1950,7 +1950,7 @@ class TestIntFlag(unittest.TestCase):
self.assertEqual(repr(Open.AC), '<Open.AC: 3>')
self.assertEqual(repr(Open.RO | Open.CE), '<Open.CE: 524288>')
self.assertEqual(repr(Open.WO | Open.CE), '<Open.CE|WO: 524289>')
- self.assertEqual(repr(Open(4)), '<Open: 4>')
+ self.assertEqual(repr(Open(4)), '<Open.4: 4>')
self.assertEqual(repr(~Open.RO), '<Open.CE|AC|-524292: -1>')
self.assertEqual(repr(~Open.WO), '<Open.CE|RW|-524292: -2>')
self.assertEqual(repr(~Open.AC), '<Open.CE|-524292: -4>')