mirror of
https://github.com/python/cpython.git
synced 2025-11-26 21:33:10 +00:00
bpo-34750: [Enum] add _EnumDict.update() support (GH-23725)
This allows easier Enum construction in unusual cases, such as including dynamic member definitions into a class definition:
# created dynamically
foo_defines = {'FOO_CAT': 'aloof', 'BAR_DOG': 'friendly', 'FOO_HORSE': 'big'}
class Foo(Enum):
vars().update({
k: v
for k, v in foo_defines.items()
if k.startswith('FOO_')
})
def upper(self):
# example method
return self.value.upper()
This commit is contained in:
parent
efb13be72c
commit
a658287179
3 changed files with 40 additions and 1 deletions
12
Lib/enum.py
12
Lib/enum.py
|
|
@ -136,7 +136,7 @@ class _EnumDict(dict):
|
|||
key = '_order_'
|
||||
elif key in self._member_names:
|
||||
# descriptor overwriting an enum?
|
||||
raise TypeError('Attempted to reuse key: %r' % key)
|
||||
raise TypeError('%r already defined as: %r' % (key, self[key]))
|
||||
elif key in self._ignore:
|
||||
pass
|
||||
elif not _is_descriptor(value):
|
||||
|
|
@ -157,6 +157,16 @@ class _EnumDict(dict):
|
|||
self._last_values.append(value)
|
||||
super().__setitem__(key, value)
|
||||
|
||||
def update(self, members, **more_members):
|
||||
try:
|
||||
for name in members.keys():
|
||||
self[name] = members[name]
|
||||
except AttributeError:
|
||||
for name, value in members:
|
||||
self[name] = value
|
||||
for name, value in more_members.items():
|
||||
self[name] = value
|
||||
|
||||
|
||||
# Dummy value for Enum as EnumMeta explicitly checks for it, but of course
|
||||
# until EnumMeta finishes running the first time the Enum class doesn't exist.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue