From 019f0a0cb85ebc234356415f3638b9bd77528e55 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 12 Sep 2018 11:43:34 -0700 Subject: bpo-34536: raise error for invalid _missing_ results (GH-9147) * raise exception if _missing_ returns None or invalid type --- Lib/enum.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'Lib/enum.py') diff --git a/Lib/enum.py b/Lib/enum.py index 0839671cca..02405c865b 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -585,7 +585,25 @@ class Enum(metaclass=EnumMeta): if member._value_ == value: return member # still not found -- try _missing_ hook - return cls._missing_(value) + try: + exc = None + result = cls._missing_(value) + except Exception as e: + exc = e + result = None + if isinstance(result, cls): + return result + else: + ve_exc = ValueError("%r is not a valid %s" % (value, cls.__name__)) + if result is None and exc is None: + raise ve_exc + elif exc is None: + exc = TypeError( + 'error in %s._missing_: returned %r instead of None or a valid member' + % (cls.__name__, result) + ) + exc.__context__ = ve_exc + raise exc def _generate_next_value_(name, start, count, last_values): for last_value in reversed(last_values): -- cgit v1.2.1