summaryrefslogtreecommitdiffstats
path: root/Lib/enum.py
diff options
context:
space:
mode:
authorEthan Furman <ethan@stoneleaf.us>2022-11-06 01:01:08 (GMT)
committerGitHub <noreply@github.com>2022-11-06 01:01:08 (GMT)
commit8feb7ab77c80968a6de6079299a39b0494b1701b (patch)
tree8e045f6d6400930064f04a5d4a11ab1209a22050 /Lib/enum.py
parent586b07e1f9f15825e6564df031744fe812b28655 (diff)
downloadcpython-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.py33
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):