Skip to content

Commit 2a4d8c0

Browse files
authored
gh-102549: [Enum] fail enum creation when data type raises in __init__ (GH-103149)
1 parent dfc4c95 commit 2a4d8c0

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

Lib/enum.py

+11-14
Original file line numberDiff line numberDiff line change
@@ -266,23 +266,20 @@ def __set_name__(self, enum_class, member_name):
266266
args = (args, ) # wrap it one more time
267267
if not enum_class._use_args_:
268268
enum_member = enum_class._new_member_(enum_class)
269-
if not hasattr(enum_member, '_value_'):
269+
else:
270+
enum_member = enum_class._new_member_(enum_class, *args)
271+
if not hasattr(enum_member, '_value_'):
272+
if enum_class._member_type_ is object:
273+
enum_member._value_ = value
274+
else:
270275
try:
271276
enum_member._value_ = enum_class._member_type_(*args)
272277
except Exception as exc:
273-
enum_member._value_ = value
274-
else:
275-
enum_member = enum_class._new_member_(enum_class, *args)
276-
if not hasattr(enum_member, '_value_'):
277-
if enum_class._member_type_ is object:
278-
enum_member._value_ = value
279-
else:
280-
try:
281-
enum_member._value_ = enum_class._member_type_(*args)
282-
except Exception as exc:
283-
raise TypeError(
284-
'_value_ not set in __new__, unable to create it'
285-
) from None
278+
new_exc = TypeError(
279+
'_value_ not set in __new__, unable to create it'
280+
)
281+
new_exc.__cause__ = exc
282+
raise new_exc
286283
value = enum_member._value_
287284
enum_member._name_ = member_name
288285
enum_member.__objclass__ = enum_class

Lib/test/test_enum.py

+20
Original file line numberDiff line numberDiff line change
@@ -2916,6 +2916,26 @@ def __new__(cls, c):
29162916
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
29172917
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
29182918

2919+
def test_init_exception(self):
2920+
class Base:
2921+
def __init__(self, x):
2922+
raise ValueError("I don't like", x)
2923+
with self.assertRaises(TypeError):
2924+
class MyEnum(Base, enum.Enum):
2925+
A = 'a'
2926+
def __init__(self, y):
2927+
self.y = y
2928+
with self.assertRaises(ValueError):
2929+
class MyEnum(Base, enum.Enum):
2930+
A = 'a'
2931+
def __init__(self, y):
2932+
self.y = y
2933+
def __new__(cls, value):
2934+
member = Base.__new__(cls)
2935+
member._value_ = Base(value)
2936+
return member
2937+
2938+
29192939
class TestOrder(unittest.TestCase):
29202940
"test usage of the `_order_` attribute"
29212941

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Don't ignore exceptions in member type creation.

0 commit comments

Comments
 (0)