diff options
| author | Ethan Furman <ethan@stoneleaf.us> | 2024-02-04 15:22:55 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-04 15:22:55 (GMT) |
| commit | ff7588b729a2a414ea189a2012904da3fbd1401c (patch) | |
| tree | cb5bcbe6dabb0c9458dc28491dd4172b65cf60e0 /Lib/enum.py | |
| parent | ec69e1d0ddc9906e0fb755a5234aeabdc96450ab (diff) | |
| download | cpython-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.py | 10 |
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) |
