mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-109022: [Enum] require names=()
to create empty enum type (GH-109048)
add guard so that ``Enum('bar')`` raises a TypeError instead of creating a new enum class called `bar`. To create the new but empty class, use: huh = Enum('bar', names=())
This commit is contained in:
parent
b9831e5c98
commit
c74e440168
3 changed files with 14 additions and 4 deletions
|
@ -730,6 +730,11 @@ class EnumType(type):
|
|||
value = (value, names) + values
|
||||
return cls.__new__(cls, value)
|
||||
# otherwise, functional API: we're creating a new Enum type
|
||||
if names is None and type is None:
|
||||
# no body? no data-type? possibly wrong usage
|
||||
raise TypeError(
|
||||
f"{cls} has no members; specify `names=()` if you meant to create a new, empty, enum"
|
||||
)
|
||||
return cls._create_(
|
||||
class_name=value,
|
||||
names=names,
|
||||
|
|
|
@ -316,6 +316,7 @@ class _EnumTests:
|
|||
return self.name.title()
|
||||
def __format__(self, spec):
|
||||
return ''.join(reversed(self.name))
|
||||
self.NewBaseEnum = NewBaseEnum
|
||||
class NewSubEnum(NewBaseEnum):
|
||||
first = auto()
|
||||
self.NewSubEnum = NewSubEnum
|
||||
|
@ -382,10 +383,8 @@ class _EnumTests:
|
|||
return self.name.title()
|
||||
def __format__(self, spec):
|
||||
return ''.join(reversed(self.name))
|
||||
NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__))
|
||||
class NewSubEnum(NewBaseEnum):
|
||||
first = auto()
|
||||
self.NewSubEnum = NewBaseEnum('NewSubEnum', 'first')
|
||||
self.NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__))
|
||||
self.NewSubEnum = self.NewBaseEnum('NewSubEnum', 'first')
|
||||
#
|
||||
def _generate_next_value_(name, start, last, values):
|
||||
pass
|
||||
|
@ -601,6 +600,10 @@ class _EnumTests:
|
|||
self.assertTrue('description' not in dir(SubEnum))
|
||||
self.assertTrue('description' in dir(SubEnum.sample), dir(SubEnum.sample))
|
||||
|
||||
def test_empty_enum_has_no_values(self):
|
||||
with self.assertRaisesRegex(TypeError, "<.... 'NewBaseEnum'> has no members"):
|
||||
self.NewBaseEnum(7)
|
||||
|
||||
def test_enum_in_enum_out(self):
|
||||
Main = self.MainEnum
|
||||
self.assertIs(Main(Main.first), Main.first)
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Enum: require ``names=()`` or ``type=...`` to create an empty enum using
|
||||
the functional syntax.
|
Loading…
Add table
Add a link
Reference in a new issue