Skip to content

Commit

Permalink
pythongh-100098: [Enum] insist on actual tuples, no subclasses, for a…
Browse files Browse the repository at this point in the history
…uto (pythonGH-100099)

When checking for auto() instances, only top-level usage is supported,
which means either alone or as part of a regular tuple. Other
containers, such as lists, dicts, or namedtuples, will not have auto()
transformed into a value.
(cherry picked from commit ded02ca)

Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
  • Loading branch information
ethanfurman authored and miss-islington committed Dec 8, 2022
1 parent 846898e commit c8d0baa
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
4 changes: 3 additions & 1 deletion Lib/enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,9 @@ def __setitem__(self, key, value):
if isinstance(value, auto):
single = True
value = (value, )
if isinstance(value, tuple):
if type(value) is tuple and any(isinstance(v, auto) for v in value):
# insist on an actual tuple, no subclasses, in keeping with only supporting
# top-level auto() usage (not contained in any other data structure)
auto_valued = []
for v in value:
if isinstance(v, auto):
Expand Down
13 changes: 13 additions & 0 deletions Lib/test/test_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -2727,6 +2727,19 @@ class MyIntFlag(IntFlag):
self.assertEqual(deep, flags)
self.assertEqual(copied.value, 1 | 2 | 8)

def test_namedtuple_as_value(self):
from collections import namedtuple
TTuple = namedtuple('TTuple', 'id a blist')
class NTEnum(Enum):
NONE = TTuple(0, 0, [])
A = TTuple(1, 2, [4])
B = TTuple(2, 4, [0, 1, 2])
self.assertEqual(repr(NTEnum.NONE), "<NTEnum.NONE: TTuple(id=0, a=0, blist=[])>")
self.assertEqual(NTEnum.NONE.value, TTuple(id=0, a=0, blist=[]))
self.assertEqual(
[x.value for x in NTEnum],
[TTuple(id=0, a=0, blist=[]), TTuple(id=1, a=2, blist=[4]), TTuple(id=2, a=4, blist=[0, 1, 2])],
)

class TestOrder(unittest.TestCase):
"test usage of the `_order_` attribute"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix ``tuple`` subclasses being cast to ``tuple`` when used as enum values.

0 comments on commit c8d0baa

Please sign in to comment.