From 1b91963b119ab1afb4cbab7bb38947e40ab4c4f9 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Thu, 9 Mar 2023 09:40:03 -0800 Subject: [PATCH 1/2] wip --- Lib/enum.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index 8c77117ce6acb4..81d3759248a420 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -266,23 +266,18 @@ 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 + raise TypeError( + '_value_ not set in __new__, unable to create it' + ) from None value = enum_member._value_ enum_member._name_ = member_name enum_member.__objclass__ = enum_class From d2ac846b0dc87c90659047270c3e0561321d3b9b Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Fri, 31 Mar 2023 10:06:48 -0700 Subject: [PATCH 2/2] fail when data type raises in its __init__ --- Lib/enum.py | 6 ++++-- Lib/test/test_enum.py | 20 +++++++++++++++++++ ...-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst | 1 + 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst diff --git a/Lib/enum.py b/Lib/enum.py index 81d3759248a420..4e231e7e8ea779 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -275,9 +275,11 @@ def __set_name__(self, enum_class, member_name): try: enum_member._value_ = enum_class._member_type_(*args) except Exception as exc: - raise TypeError( + new_exc = TypeError( '_value_ not set in __new__, unable to create it' - ) from None + ) + new_exc.__cause__ = exc + raise new_exc value = enum_member._value_ enum_member._name_ = member_name enum_member.__objclass__ = enum_class diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index bea19542705dc4..ee5280601be184 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2916,6 +2916,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" diff --git a/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst b/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst new file mode 100644 index 00000000000000..e4def038175b87 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst @@ -0,0 +1 @@ +Don't ignore exceptions in member type creation.