mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
gh-103056: [Enum] ensure final _generate_next_value_ is a staticmethod (GH-103062)
This commit is contained in:
parent
56d055a0d8
commit
b838d80085
3 changed files with 23 additions and 0 deletions
|
@ -518,8 +518,13 @@ class EnumType(type):
|
|||
#
|
||||
# adjust the sunders
|
||||
_order_ = classdict.pop('_order_', None)
|
||||
_gnv = classdict.get('_generate_next_value_')
|
||||
if _gnv is not None and type(_gnv) is not staticmethod:
|
||||
_gnv = staticmethod(_gnv)
|
||||
# convert to normal dict
|
||||
classdict = dict(classdict.items())
|
||||
if _gnv is not None:
|
||||
classdict['_generate_next_value_'] = _gnv
|
||||
#
|
||||
# data type of member and the controlling Enum class
|
||||
member_type, first_enum = metacls._get_mixins_(cls, bases)
|
||||
|
|
|
@ -270,6 +270,17 @@ class _EnumTests:
|
|||
first = auto()
|
||||
self.NewSubEnum = NewSubEnum
|
||||
#
|
||||
class LazyGNV(self.enum_type):
|
||||
def _generate_next_value_(name, start, last, values):
|
||||
pass
|
||||
self.LazyGNV = LazyGNV
|
||||
#
|
||||
class BusyGNV(self.enum_type):
|
||||
@staticmethod
|
||||
def _generate_next_value_(name, start, last, values):
|
||||
pass
|
||||
self.BusyGNV = BusyGNV
|
||||
#
|
||||
self.is_flag = False
|
||||
self.names = ['first', 'second', 'third']
|
||||
if issubclass(MainEnum, StrEnum):
|
||||
|
@ -466,6 +477,12 @@ class _EnumTests:
|
|||
Main = self.MainEnum
|
||||
self.assertIs(Main(Main.first), Main.first)
|
||||
|
||||
def test_gnv_is_static(self):
|
||||
lazy = self.LazyGNV
|
||||
busy = self.BusyGNV
|
||||
self.assertTrue(type(lazy.__dict__['_generate_next_value_']) is staticmethod)
|
||||
self.assertTrue(type(busy.__dict__['_generate_next_value_']) is staticmethod)
|
||||
|
||||
def test_hash(self):
|
||||
MainEnum = self.MainEnum
|
||||
mapping = {}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Ensure final ``_generate_next_value_`` is a ``staticmethod``.
|
Loading…
Add table
Add a link
Reference in a new issue