summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-04-03 23:01:31 (GMT)
committerGitHub <noreply@github.com>2023-04-03 23:01:31 (GMT)
commit5342f5e713e0cc45b6f226d2d053a8cde1b4d68e (patch)
tree7433b306aa10e088a2f56519081bb627987d0bf9
parentcf72cc25f600183c69e3639e78cfae3571f8d4d0 (diff)
downloadcpython-5342f5e713e0cc45b6f226d2d053a8cde1b4d68e.zip
cpython-5342f5e713e0cc45b6f226d2d053a8cde1b4d68e.tar.gz
cpython-5342f5e713e0cc45b6f226d2d053a8cde1b4d68e.tar.bz2
gh-102549: [Enum] fail enum creation when data type raises in __init__ (GH-103149)
(cherry picked from commit 2a4d8c0a9e88f45047da640ce5a92b304d2d39b1) Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
-rw-r--r--Lib/enum.py25
-rw-r--r--Lib/test/test_enum.py20
-rw-r--r--Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst1
3 files changed, 32 insertions, 14 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index 9138e50..13da287 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -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
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index e9dae29..0906073 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -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
index 0000000..e4def03
--- /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.