]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-102549: [Enum] fail enum creation when data type raises in __init__ (GH-103149)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 3 Apr 2023 23:01:31 +0000 (16:01 -0700)
committerGitHub <noreply@github.com>
Mon, 3 Apr 2023 23:01:31 +0000 (16:01 -0700)
(cherry picked from commit 2a4d8c0a9e88f45047da640ce5a92b304d2d39b1)

Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Lib/enum.py
Lib/test/test_enum.py
Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst [new file with mode: 0644]

index 9138e50c3c6fa38e3177dddae757572e39a2e124..13da287b34aa5a32cc95d3c101a3cbe89bf1548d 100644 (file)
@@ -250,23 +250,20 @@ class _proto_member:
             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
index e9dae29d26872d6d60041c885eeb0ad467e872b0..09060733bc5139345cc8c20a2b134886790d1a85 100644 (file)
@@ -2787,6 +2787,26 @@ class TestSpecial(unittest.TestCase):
         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 (file)
index 0000000..e4def03
--- /dev/null
@@ -0,0 +1 @@
+Don't ignore exceptions in member type creation.