Skip to content

Commit

Permalink
gh-102549: [Enum] fail enum creation when data type raises in __init__ (
Browse files Browse the repository at this point in the history
GH-103149)

(cherry picked from commit 2a4d8c0)

Co-authored-by: Ethan Furman <[email protected]>
  • Loading branch information
miss-islington and ethanfurman authored Apr 3, 2023
1 parent cf72cc2 commit 5342f5e
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 14 deletions.
25 changes: 11 additions & 14 deletions Lib/enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,23 +250,20 @@ def __set_name__(self, enum_class, member_name):
args = (args, ) # wrap it one more time
if not enum_class._use_args_:
enum_member = enum_class._new_member_(enum_class)
if not hasattr(enum_member, '_value_'):
else:
enum_member = enum_class._new_member_(enum_class, *args)
if not hasattr(enum_member, '_value_'):
if enum_class._member_type_ is object:
enum_member._value_ = value
else:
try:
enum_member._value_ = enum_class._member_type_(*args)
except Exception as exc:
enum_member._value_ = value
else:
enum_member = enum_class._new_member_(enum_class, *args)
if not hasattr(enum_member, '_value_'):
if enum_class._member_type_ is object:
enum_member._value_ = value
else:
try:
enum_member._value_ = enum_class._member_type_(*args)
except Exception as exc:
raise TypeError(
'_value_ not set in __new__, unable to create it'
) from None
new_exc = TypeError(
'_value_ not set in __new__, unable to create it'
)
new_exc.__cause__ = exc
raise new_exc
value = enum_member._value_
enum_member._name_ = member_name
enum_member.__objclass__ = enum_class
Expand Down
20 changes: 20 additions & 0 deletions Lib/test/test_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -2787,6 +2787,26 @@ def __new__(cls, c):
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)

def test_init_exception(self):
class Base:
def __init__(self, x):
raise ValueError("I don't like", x)
with self.assertRaises(TypeError):
class MyEnum(Base, enum.Enum):
A = 'a'
def __init__(self, y):
self.y = y
with self.assertRaises(ValueError):
class MyEnum(Base, enum.Enum):
A = 'a'
def __init__(self, y):
self.y = y
def __new__(cls, value):
member = Base.__new__(cls)
member._value_ = Base(value)
return member


class TestOrder(unittest.TestCase):
"test usage of the `_order_` attribute"

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

0 comments on commit 5342f5e

Please sign in to comment.