Skip to content

Commit 5342f5e

Browse files
gh-102549: [Enum] fail enum creation when data type raises in __init__ (GH-103149)
(cherry picked from commit 2a4d8c0) Co-authored-by: Ethan Furman <[email protected]>
1 parent cf72cc2 commit 5342f5e

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
@@ -250,23 +250,20 @@ def __set_name__(self, enum_class, member_name):
250250
args = (args, ) # wrap it one more time
251251
if not enum_class._use_args_:
252252
enum_member = enum_class._new_member_(enum_class)
253-
if not hasattr(enum_member, '_value_'):
253+
else:
254+
enum_member = enum_class._new_member_(enum_class, *args)
255+
if not hasattr(enum_member, '_value_'):
256+
if enum_class._member_type_ is object:
257+
enum_member._value_ = value
258+
else:
254259
try:
255260
enum_member._value_ = enum_class._member_type_(*args)
256261
except Exception as exc:
257-
enum_member._value_ = value
258-
else:
259-
enum_member = enum_class._new_member_(enum_class, *args)
260-
if not hasattr(enum_member, '_value_'):
261-
if enum_class._member_type_ is object:
262-
enum_member._value_ = value
263-
else:
264-
try:
265-
enum_member._value_ = enum_class._member_type_(*args)
266-
except Exception as exc:
267-
raise TypeError(
268-
'_value_ not set in __new__, unable to create it'
269-
) from None
262+
new_exc = TypeError(
263+
'_value_ not set in __new__, unable to create it'
264+
)
265+
new_exc.__cause__ = exc
266+
raise new_exc
270267
value = enum_member._value_
271268
enum_member._name_ = member_name
272269
enum_member.__objclass__ = enum_class

Lib/test/test_enum.py

+20
Original file line numberDiff line numberDiff line change
@@ -2787,6 +2787,26 @@ def __new__(cls, c):
27872787
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
27882788
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
27892789

2790+
def test_init_exception(self):
2791+
class Base:
2792+
def __init__(self, x):
2793+
raise ValueError("I don't like", x)
2794+
with self.assertRaises(TypeError):
2795+
class MyEnum(Base, enum.Enum):
2796+
A = 'a'
2797+
def __init__(self, y):
2798+
self.y = y
2799+
with self.assertRaises(ValueError):
2800+
class MyEnum(Base, enum.Enum):
2801+
A = 'a'
2802+
def __init__(self, y):
2803+
self.y = y
2804+
def __new__(cls, value):
2805+
member = Base.__new__(cls)
2806+
member._value_ = Base(value)
2807+
return member
2808+
2809+
27902810
class TestOrder(unittest.TestCase):
27912811
"test usage of the `_order_` attribute"
27922812

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)