mirror of
https://github.com/python/cpython.git
synced 2025-10-03 05:35:59 +00:00
gh-102549: [Enum] fail enum creation when data type raises in __init__ (GH-103149)
(cherry picked from commit 2a4d8c0a9e
)
Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
This commit is contained in:
parent
cf72cc25f6
commit
5342f5e713
3 changed files with 32 additions and 14 deletions
25
Lib/enum.py
25
Lib/enum.py
|
@ -250,23 +250,20 @@ class _proto_member:
|
||||||
args = (args, ) # wrap it one more time
|
args = (args, ) # wrap it one more time
|
||||||
if not enum_class._use_args_:
|
if not enum_class._use_args_:
|
||||||
enum_member = enum_class._new_member_(enum_class)
|
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:
|
try:
|
||||||
enum_member._value_ = enum_class._member_type_(*args)
|
enum_member._value_ = enum_class._member_type_(*args)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
enum_member._value_ = value
|
new_exc = TypeError(
|
||||||
else:
|
'_value_ not set in __new__, unable to create it'
|
||||||
enum_member = enum_class._new_member_(enum_class, *args)
|
)
|
||||||
if not hasattr(enum_member, '_value_'):
|
new_exc.__cause__ = exc
|
||||||
if enum_class._member_type_ is object:
|
raise new_exc
|
||||||
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
|
|
||||||
value = enum_member._value_
|
value = enum_member._value_
|
||||||
enum_member._name_ = member_name
|
enum_member._name_ = member_name
|
||||||
enum_member.__objclass__ = enum_class
|
enum_member.__objclass__ = enum_class
|
||||||
|
|
|
@ -2787,6 +2787,26 @@ class TestSpecial(unittest.TestCase):
|
||||||
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
|
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
|
||||||
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
|
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):
|
class TestOrder(unittest.TestCase):
|
||||||
"test usage of the `_order_` attribute"
|
"test usage of the `_order_` attribute"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Don't ignore exceptions in member type creation.
|
Loading…
Add table
Add a link
Reference in a new issue