summaryrefslogtreecommitdiffstats
path: root/Lib/enum.py
diff options
context:
space:
mode:
authorEthan Furman <ethan@stoneleaf.us>2024-02-04 15:22:55 (GMT)
committerGitHub <noreply@github.com>2024-02-04 15:22:55 (GMT)
commitff7588b729a2a414ea189a2012904da3fbd1401c (patch)
treecb5bcbe6dabb0c9458dc28491dd4172b65cf60e0 /Lib/enum.py
parentec69e1d0ddc9906e0fb755a5234aeabdc96450ab (diff)
downloadcpython-ff7588b729a2a414ea189a2012904da3fbd1401c.zip
cpython-ff7588b729a2a414ea189a2012904da3fbd1401c.tar.gz
cpython-ff7588b729a2a414ea189a2012904da3fbd1401c.tar.bz2
gh-114071: [Enum] update docs and code for tuples/subclasses (GH-114871)
Update documentation with `__new__` and `__init__` entries. Support use of `auto()` in tuple subclasses on member assignment lines. Previously, auto() was only supported on the member definition line either solo or as part of a tuple: RED = auto() BLUE = auto(), 'azul' However, since Python itself supports using tuple subclasses where tuples are expected, e.g.: from collections import namedtuple T = namedtuple('T', 'first second third') def test(one, two, three): print(one, two, three) test(*T(4, 5, 6)) # 4 5 6 it made sense to also support tuple subclasses in enum definitions.
Diffstat (limited to 'Lib/enum.py')
-rw-r--r--Lib/enum.py10
1 files changed, 8 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)