mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
issue26981: add _order_ compatibility shim to enum.Enum
This commit is contained in:
parent
3e45875578
commit
e8e61277ff
4 changed files with 100 additions and 3 deletions
17
Lib/enum.py
17
Lib/enum.py
|
@ -64,9 +64,11 @@ class _EnumDict(dict):
|
|||
|
||||
"""
|
||||
if _is_sunder(key):
|
||||
raise ValueError('_names_ are reserved for future Enum use')
|
||||
if key not in ('_order_', ):
|
||||
raise ValueError('_names_ are reserved for future Enum use')
|
||||
elif _is_dunder(key):
|
||||
pass
|
||||
if key == '__order__':
|
||||
key = '_order_'
|
||||
elif key in self._member_names:
|
||||
# descriptor overwriting an enum?
|
||||
raise TypeError('Attempted to reuse key: %r' % key)
|
||||
|
@ -106,6 +108,9 @@ class EnumMeta(type):
|
|||
for name in classdict._member_names:
|
||||
del classdict[name]
|
||||
|
||||
# adjust the sunders
|
||||
_order_ = classdict.pop('_order_', None)
|
||||
|
||||
# check for illegal enum names (any others?)
|
||||
invalid_names = set(members) & {'mro', }
|
||||
if invalid_names:
|
||||
|
@ -210,6 +215,14 @@ class EnumMeta(type):
|
|||
if save_new:
|
||||
enum_class.__new_member__ = __new__
|
||||
enum_class.__new__ = Enum.__new__
|
||||
|
||||
# py3 support for definition order (helps keep py2/py3 code in sync)
|
||||
if _order_ is not None:
|
||||
if isinstance(_order_, str):
|
||||
_order_ = _order_.replace(',', ' ').split()
|
||||
if _order_ != enum_class._member_names_:
|
||||
raise TypeError('member order does not match _order_')
|
||||
|
||||
return enum_class
|
||||
|
||||
def __bool__(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue