Skip to content

Commit d4426c8

Browse files
gh-100098: [Enum] insist on actual tuples, no subclasses, for auto (GH-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 <[email protected]>
1 parent 846898e commit d4426c8

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

Lib/enum.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,9 @@ def __setitem__(self, key, value):
430430
if isinstance(value, auto):
431431
single = True
432432
value = (value, )
433-
if isinstance(value, tuple):
433+
if type(value) is tuple and any(isinstance(v, auto) for v in value):
434+
# insist on an actual tuple, no subclasses, in keeping with only supporting
435+
# top-level auto() usage (not contained in any other data structure)
434436
auto_valued = []
435437
for v in value:
436438
if isinstance(v, auto):

Lib/test/test_enum.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2727,6 +2727,19 @@ class MyIntFlag(IntFlag):
27272727
self.assertEqual(deep, flags)
27282728
self.assertEqual(copied.value, 1 | 2 | 8)
27292729

2730+
def test_namedtuple_as_value(self):
2731+
from collections import namedtuple
2732+
TTuple = namedtuple('TTuple', 'id a blist')
2733+
class NTEnum(Enum):
2734+
NONE = TTuple(0, 0, [])
2735+
A = TTuple(1, 2, [4])
2736+
B = TTuple(2, 4, [0, 1, 2])
2737+
self.assertEqual(repr(NTEnum.NONE), "<NTEnum.NONE: TTuple(id=0, a=0, blist=[])>")
2738+
self.assertEqual(NTEnum.NONE.value, TTuple(id=0, a=0, blist=[]))
2739+
self.assertEqual(
2740+
[x.value for x in NTEnum],
2741+
[TTuple(id=0, a=0, blist=[]), TTuple(id=1, a=2, blist=[4]), TTuple(id=2, a=4, blist=[0, 1, 2])],
2742+
)
27302743

27312744
class TestOrder(unittest.TestCase):
27322745
"test usage of the `_order_` attribute"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix ``tuple`` subclasses being cast to ``tuple`` when used as enum values.

0 commit comments

Comments
 (0)