]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Enum: make `Flag` and `IntFlag` members iterable (GH-22221)
authorEthan Furman <ethan@stoneleaf.us>
Wed, 16 Sep 2020 20:01:00 +0000 (13:01 -0700)
committerGitHub <noreply@github.com>
Wed, 16 Sep 2020 20:01:00 +0000 (13:01 -0700)
Doc/library/enum.rst
Lib/enum.py
Lib/test/test_enum.py
Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst [new file with mode: 0644]

index 32e8bbf95092733c234fb607fed55abeaae88517..2f84be229bc4da6ef2f8b43397ff60ab9c415176 100644 (file)
@@ -656,6 +656,13 @@ be combined with them::
     >>> Perm.X | 8
     <Perm.8|X: 9>
 
+:class:`IntFlag` members can also be iterated over::
+
+    >>> list(RW)
+    [<Perm.R: 4>, <Perm.W: 2>]
+
+.. versionadded:: 3.10
+
 
 Flag
 ^^^^
@@ -709,6 +716,14 @@ value::
     >>> bool(Color.BLACK)
     False
 
+:class:`Flag` members can also be iterated over::
+
+    >>> purple = Color.RED | Color.BLUE
+    >>> list(purple)
+    [<Color.BLUE: 2>, <Color.RED: 1>]
+
+.. versionadded:: 3.10
+
 .. note::
 
     For the majority of new code, :class:`Enum` and :class:`Flag` are strongly
index 21a94caaee33f3451096259dcda23adc3c54cea8..3c459ea4113d0b5b84c67515e1d7b074f962a5d0 100644 (file)
@@ -753,6 +753,10 @@ class Flag(Enum):
                     type(other).__qualname__, self.__class__.__qualname__))
         return other._value_ & self._value_ == other._value_
 
+    def __iter__(self):
+        members, extra_flags = _decompose(self.__class__, self.value)
+        return (m for m in members if m._value_ != 0)
+
     def __repr__(self):
         cls = self.__class__
         if self._name_ is not None:
index ebf76047972dc0b7e5cfedb2ff1a119e0e1a2e40..59789fb7bcc5fdea0fa0f6ff3ca659086c1923e4 100644 (file)
@@ -2350,6 +2350,12 @@ class TestFlag(unittest.TestCase):
         self.assertFalse(W in RX)
         self.assertFalse(X in RW)
 
+    def test_member_iter(self):
+        Color = self.Color
+        self.assertEqual(list(Color.PURPLE), [Color.BLUE, Color.RED])
+        self.assertEqual(list(Color.BLUE), [Color.BLUE])
+        self.assertEqual(list(Color.GREEN), [Color.GREEN])
+
     def test_auto_number(self):
         class Color(Flag):
             red = auto()
@@ -2805,6 +2811,12 @@ class TestIntFlag(unittest.TestCase):
         with self.assertRaises(TypeError):
             self.assertFalse('test' in RW)
 
+    def test_member_iter(self):
+        Color = self.Color
+        self.assertEqual(list(Color.PURPLE), [Color.BLUE, Color.RED])
+        self.assertEqual(list(Color.BLUE), [Color.BLUE])
+        self.assertEqual(list(Color.GREEN), [Color.GREEN])
+
     def test_bool(self):
         Perm = self.Perm
         for f in Perm:
diff --git a/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst b/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst
new file mode 100644 (file)
index 0000000..d5832b9
--- /dev/null
@@ -0,0 +1 @@
+`enum.Flag` and `enum.IntFlag` members are now iterable