diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-12-08 07:21:29 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-08 07:21:29 (GMT) |
commit | d4426c829565e3ef922c091ee9bd48bc556f2550 (patch) | |
tree | db55eedff5f38c254f7a6caedb3de829ae1d0971 /Lib | |
parent | 846898e5ab0fb1bf740263573f01669be186645f (diff) | |
download | cpython-d4426c829565e3ef922c091ee9bd48bc556f2550.zip cpython-d4426c829565e3ef922c091ee9bd48bc556f2550.tar.gz cpython-d4426c829565e3ef922c091ee9bd48bc556f2550.tar.bz2 |
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 ded02ca54d7bfa32c8eab0871d56e4547cd356eb)
Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/enum.py | 4 | ||||
-rw-r--r-- | Lib/test/test_enum.py | 13 |
2 files changed, 16 insertions, 1 deletions
diff --git a/Lib/enum.py b/Lib/enum.py index 1efddfa..7ad599b 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -430,7 +430,9 @@ class _EnumDict(dict): 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): diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index a9b80ad..0e2da1d 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2727,6 +2727,19 @@ class TestSpecial(unittest.TestCase): 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" |