mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
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.
This commit is contained in:
parent
cce8362960
commit
ded02ca54d
@ -436,7 +436,9 @@ class _EnumDict(dict):
|
|||||||
if isinstance(value, auto):
|
if isinstance(value, auto):
|
||||||
single = True
|
single = True
|
||||||
value = (value, )
|
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 = []
|
auto_valued = []
|
||||||
for v in value:
|
for v in value:
|
||||||
if isinstance(v, auto):
|
if isinstance(v, auto):
|
||||||
|
@ -2841,6 +2841,19 @@ class TestSpecial(unittest.TestCase):
|
|||||||
self.assertEqual(deep, flags)
|
self.assertEqual(deep, flags)
|
||||||
self.assertEqual(copied.value, 1 | 2 | 8)
|
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):
|
class TestOrder(unittest.TestCase):
|
||||||
"test usage of the `_order_` attribute"
|
"test usage of the `_order_` attribute"
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Fix ``tuple`` subclasses being cast to ``tuple`` when used as enum values.
|
Loading…
Reference in New Issue
Block a user