diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2023-04-03 23:01:31 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-03 23:01:31 (GMT) |
commit | 5342f5e713e0cc45b6f226d2d053a8cde1b4d68e (patch) | |
tree | 7433b306aa10e088a2f56519081bb627987d0bf9 | |
parent | cf72cc25f600183c69e3639e78cfae3571f8d4d0 (diff) | |
download | cpython-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.py | 25 | ||||
-rw-r--r-- | Lib/test/test_enum.py | 20 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst | 1 |
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. |