Skip to content

Commit ca848bb

Browse files
[3.12] gh-109022: [Enum] require names=() to create empty enum type (GH-109048) (#109122)
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=()) (cherry picked from commit c74e440) Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
1 parent d533ab1 commit ca848bb

3 files changed

Lines changed: 14 additions & 4 deletions

File tree

Lib/enum.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,11 @@ def __call__(cls, value, names=None, *values, module=None, qualname=None, type=N
739739
value = (value, names) + values
740740
return cls.__new__(cls, value)
741741
# otherwise, functional API: we're creating a new Enum type
742+
if names is None and type is None:
743+
# no body? no data-type? possibly wrong usage
744+
raise TypeError(
745+
f"{cls} has no members; specify `names=()` if you meant to create a new, empty, enum"
746+
)
742747
return cls._create_(
743748
class_name=value,
744749
names=names,

Lib/test/test_enum.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ def __str__(self):
276276
return self.name.title()
277277
def __format__(self, spec):
278278
return ''.join(reversed(self.name))
279+
self.NewBaseEnum = NewBaseEnum
279280
class NewSubEnum(NewBaseEnum):
280281
first = auto()
281282
self.NewSubEnum = NewSubEnum
@@ -342,10 +343,8 @@ def __str__(self):
342343
return self.name.title()
343344
def __format__(self, spec):
344345
return ''.join(reversed(self.name))
345-
NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__))
346-
class NewSubEnum(NewBaseEnum):
347-
first = auto()
348-
self.NewSubEnum = NewBaseEnum('NewSubEnum', 'first')
346+
self.NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__))
347+
self.NewSubEnum = self.NewBaseEnum('NewSubEnum', 'first')
349348
#
350349
def _generate_next_value_(name, start, last, values):
351350
pass
@@ -561,6 +560,10 @@ class SubEnum(SuperEnum):
561560
self.assertTrue('description' not in dir(SubEnum))
562561
self.assertTrue('description' in dir(SubEnum.sample), dir(SubEnum.sample))
563562

563+
def test_empty_enum_has_no_values(self):
564+
with self.assertRaisesRegex(TypeError, "<.... 'NewBaseEnum'> has no members"):
565+
self.NewBaseEnum(7)
566+
564567
def test_enum_in_enum_out(self):
565568
Main = self.MainEnum
566569
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)