diff options
author | Ethan Furman <ethan@stoneleaf.us> | 2022-11-06 01:01:08 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-06 01:01:08 (GMT) |
commit | 8feb7ab77c80968a6de6079299a39b0494b1701b (patch) | |
tree | 8e045f6d6400930064f04a5d4a11ab1209a22050 /Lib/enum.py | |
parent | 586b07e1f9f15825e6564df031744fe812b28655 (diff) | |
download | cpython-8feb7ab77c80968a6de6079299a39b0494b1701b.zip cpython-8feb7ab77c80968a6de6079299a39b0494b1701b.tar.gz cpython-8feb7ab77c80968a6de6079299a39b0494b1701b.tar.bz2 |
gh-93464: [Enum] fix auto() failure during multiple assignment (GH-99148)
* fix auto() failure during multiple assignment
i.e. `ONE = auto(), 'text'` will now have `ONE' with the value of `(1,
'text')`. Before it would have been `(<an auto instance>, 'text')`
Diffstat (limited to 'Lib/enum.py')
-rw-r--r-- | Lib/enum.py | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/Lib/enum.py b/Lib/enum.py index a66c344..c1ccf53 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -171,7 +171,8 @@ class auto: """ Instances are replaced with an appropriate value in Enum class suites. """ - value = _auto_null + def __init__(self, value=_auto_null): + self.value = value def __repr__(self): return "auto(%r)" % self.value @@ -427,15 +428,31 @@ class _EnumDict(dict): elif isinstance(value, member): # unwrap value here -- it will become a member value = value.value + non_auto_store = True + single = False if isinstance(value, auto): - if value.value == _auto_null: - value.value = self._generate_next_value( - key, 1, len(self._member_names), self._last_values[:], - ) - self._auto_called = True - value = value.value + single = True + value = (value, ) + if isinstance(value, tuple): + auto_valued = [] + for v in value: + if isinstance(v, auto): + non_auto_store = False + if v.value == _auto_null: + v.value = self._generate_next_value( + key, 1, len(self._member_names), self._last_values[:], + ) + self._auto_called = True + v = v.value + self._last_values.append(v) + auto_valued.append(v) + if single: + value = auto_valued[0] + else: + value = tuple(auto_valued) self._member_names[key] = None - self._last_values.append(value) + if non_auto_store: + self._last_values.append(value) super().__setitem__(key, value) def update(self, members, **more_members): |