Skip to content

Commit 7219e27

Browse files
authored
Enum: make Flag and IntFlag members iterable (GH-22221)
1 parent fc23a94 commit 7219e27

File tree

4 files changed

+32
-0
lines changed

4 files changed

+32
-0
lines changed

Doc/library/enum.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,13 @@ be combined with them::
656656
>>> Perm.X | 8
657657
<Perm.8|X: 9>
658658

659+
:class:`IntFlag` members can also be iterated over::
660+
661+
>>> list(RW)
662+
[<Perm.R: 4>, <Perm.W: 2>]
663+
664+
.. versionadded:: 3.10
665+
659666

660667
Flag
661668
^^^^
@@ -709,6 +716,14 @@ value::
709716
>>> bool(Color.BLACK)
710717
False
711718

719+
:class:`Flag` members can also be iterated over::
720+
721+
>>> purple = Color.RED | Color.BLUE
722+
>>> list(purple)
723+
[<Color.BLUE: 2>, <Color.RED: 1>]
724+
725+
.. versionadded:: 3.10
726+
712727
.. note::
713728

714729
For the majority of new code, :class:`Enum` and :class:`Flag` are strongly

Lib/enum.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,10 @@ def __contains__(self, other):
753753
type(other).__qualname__, self.__class__.__qualname__))
754754
return other._value_ & self._value_ == other._value_
755755

756+
def __iter__(self):
757+
members, extra_flags = _decompose(self.__class__, self.value)
758+
return (m for m in members if m._value_ != 0)
759+
756760
def __repr__(self):
757761
cls = self.__class__
758762
if self._name_ is not None:

Lib/test/test_enum.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2350,6 +2350,12 @@ def test_member_contains(self):
23502350
self.assertFalse(W in RX)
23512351
self.assertFalse(X in RW)
23522352

2353+
def test_member_iter(self):
2354+
Color = self.Color
2355+
self.assertEqual(list(Color.PURPLE), [Color.BLUE, Color.RED])
2356+
self.assertEqual(list(Color.BLUE), [Color.BLUE])
2357+
self.assertEqual(list(Color.GREEN), [Color.GREEN])
2358+
23532359
def test_auto_number(self):
23542360
class Color(Flag):
23552361
red = auto()
@@ -2805,6 +2811,12 @@ def test_member_contains(self):
28052811
with self.assertRaises(TypeError):
28062812
self.assertFalse('test' in RW)
28072813

2814+
def test_member_iter(self):
2815+
Color = self.Color
2816+
self.assertEqual(list(Color.PURPLE), [Color.BLUE, Color.RED])
2817+
self.assertEqual(list(Color.BLUE), [Color.BLUE])
2818+
self.assertEqual(list(Color.GREEN), [Color.GREEN])
2819+
28082820
def test_bool(self):
28092821
Perm = self.Perm
28102822
for f in Perm:
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
`enum.Flag` and `enum.IntFlag` members are now iterable

0 commit comments

Comments
 (0)