summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/enum.py10
-rw-r--r--Lib/test/test_enum.py34
2 files changed, 42 insertions, 2 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index a8a50a5..98a8966 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -409,10 +409,11 @@ class EnumDict(dict):
if isinstance(value, auto):
single = True
value = (value, )
- if type(value) is tuple and any(isinstance(v, auto) for v in value):
+ if isinstance(value, 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 = []
+ t = type(value)
for v in value:
if isinstance(v, auto):
non_auto_store = False
@@ -427,7 +428,12 @@ class EnumDict(dict):
if single:
value = auto_valued[0]
else:
- value = tuple(auto_valued)
+ try:
+ # accepts iterable as multiple arguments?
+ value = t(auto_valued)
+ except TypeError:
+ # then pass them in singlely
+ value = t(*auto_valued)
self._member_names[key] = None
if non_auto_store:
self._last_values.append(value)
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index d045739..39c1ae0 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -2344,6 +2344,40 @@ class TestSpecial(unittest.TestCase):
globals()['SomeTuple'] = SomeTuple
test_pickle_dump_load(self.assertIs, SomeTuple.first)
+ def test_tuple_subclass_with_auto_1(self):
+ from collections import namedtuple
+ T = namedtuple('T', 'index desc')
+ class SomeEnum(T, Enum):
+ __qualname__ = 'SomeEnum' # needed for pickle protocol 4
+ first = auto(), 'for the money'
+ second = auto(), 'for the show'
+ third = auto(), 'for the music'
+ self.assertIs(type(SomeEnum.first), SomeEnum)
+ self.assertEqual(SomeEnum.third.value, (3, 'for the music'))
+ self.assertIsInstance(SomeEnum.third.value, T)
+ self.assertEqual(SomeEnum.first.index, 1)
+ self.assertEqual(SomeEnum.second.desc, 'for the show')
+ globals()['SomeEnum'] = SomeEnum
+ globals()['T'] = T
+ test_pickle_dump_load(self.assertIs, SomeEnum.first)
+
+ def test_tuple_subclass_with_auto_2(self):
+ from collections import namedtuple
+ T = namedtuple('T', 'index desc')
+ class SomeEnum(Enum):
+ __qualname__ = 'SomeEnum' # needed for pickle protocol 4
+ first = T(auto(), 'for the money')
+ second = T(auto(), 'for the show')
+ third = T(auto(), 'for the music')
+ self.assertIs(type(SomeEnum.first), SomeEnum)
+ self.assertEqual(SomeEnum.third.value, (3, 'for the music'))
+ self.assertIsInstance(SomeEnum.third.value, T)
+ self.assertEqual(SomeEnum.first.value.index, 1)
+ self.assertEqual(SomeEnum.second.value.desc, 'for the show')
+ globals()['SomeEnum'] = SomeEnum
+ globals()['T'] = T
+ test_pickle_dump_load(self.assertIs, SomeEnum.first)
+
def test_duplicate_values_give_unique_enum_items(self):
class AutoNumber(Enum):
first = ()