Skip to content

Commit c74e440

Browse files
authored
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=())
1 parent b9831e5 commit c74e440

File tree

3 files changed

+14
-4
lines changed

3 files changed

+14
-4
lines changed

Lib/enum.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,11 @@ def __call__(cls, value, names=None, *values, module=None, qualname=None, type=N
730730
value = (value, names) + values
731731
return cls.__new__(cls, value)
732732
# otherwise, functional API: we're creating a new Enum type
733+
if names is None and type is None:
734+
# no body? no data-type? possibly wrong usage
735+
raise TypeError(
736+
f"{cls} has no members; specify `names=()` if you meant to create a new, empty, enum"
737+
)
733738
return cls._create_(
734739
class_name=value,
735740
names=names,

Lib/test/test_enum.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ def __str__(self):
316316
return self.name.title()
317317
def __format__(self, spec):
318318
return ''.join(reversed(self.name))
319+
self.NewBaseEnum = NewBaseEnum
319320
class NewSubEnum(NewBaseEnum):
320321
first = auto()
321322
self.NewSubEnum = NewSubEnum
@@ -382,10 +383,8 @@ def __str__(self):
382383
return self.name.title()
383384
def __format__(self, spec):
384385
return ''.join(reversed(self.name))
385-
NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__))
386-
class NewSubEnum(NewBaseEnum):
387-
first = auto()
388-
self.NewSubEnum = NewBaseEnum('NewSubEnum', 'first')
386+
self.NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__))
387+
self.NewSubEnum = self.NewBaseEnum('NewSubEnum', 'first')
389388
#
390389
def _generate_next_value_(name, start, last, values):
391390
pass
@@ -601,6 +600,10 @@ class SubEnum(SuperEnum):
601600
self.assertTrue('description' not in dir(SubEnum))
602601
self.assertTrue('description' in dir(SubEnum.sample), dir(SubEnum.sample))
603602

603+
def test_empty_enum_has_no_values(self):
604+
with self.assertRaisesRegex(TypeError, "<.... 'NewBaseEnum'> has no members"):
605+
self.NewBaseEnum(7)
606+
604607
def test_enum_in_enum_out(self):
605608
Main = self.MainEnum
606609
self.assertIs(Main(Main.first), Main.first)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Enum: require ``names=()`` or ``type=...`` to create an empty enum using
2+
the functional syntax.

0 commit comments

Comments
 (0)