bpo-39728: Enum: fix duplicate `ValueError` (GH-22277)

fix default `_missing_` to return `None` instead of raising a `ValueError`
Co-authored-by: Andrey Darascheka <andrei.daraschenka@leverx.com>
This commit is contained in:
Ethan Furman 2020-09-16 10:26:50 -07:00 committed by GitHub
parent 83f6dcd207
commit c95ad7a91f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 2 deletions

View File

@ -629,7 +629,7 @@ class Enum(metaclass=EnumMeta):
@classmethod @classmethod
def _missing_(cls, value): def _missing_(cls, value):
raise ValueError("%r is not a valid %s" % (value, cls.__qualname__)) return None
def __repr__(self): def __repr__(self):
return "<%s.%s: %r>" % ( return "<%s.%s: %r>" % (

View File

@ -1845,6 +1845,18 @@ class TestEnum(unittest.TestCase):
third = auto() third = auto()
self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes)) self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes))
def test_default_missing(self):
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
try:
Color(7)
except ValueError as exc:
self.assertTrue(exc.__context__ is None)
else:
raise Exception('Exception not raised.')
def test_missing(self): def test_missing(self):
class Color(Enum): class Color(Enum):
red = 1 red = 1
@ -1863,7 +1875,12 @@ class TestEnum(unittest.TestCase):
# trigger not found # trigger not found
return None return None
self.assertIs(Color('three'), Color.blue) self.assertIs(Color('three'), Color.blue)
self.assertRaises(ValueError, Color, 7) try:
Color(7)
except ValueError as exc:
self.assertTrue(exc.__context__ is None)
else:
raise Exception('Exception not raised.')
try: try:
Color('bad return') Color('bad return')
except TypeError as exc: except TypeError as exc:

View File

@ -433,6 +433,7 @@ Marcos Donolo
Dima Dorfman Dima Dorfman
Yves Dorfsman Yves Dorfsman
Michael Dorman Michael Dorman
Andrey Doroschenko
Steve Dower Steve Dower
Allen Downey Allen Downey
Cesar Douady Cesar Douady

View File

@ -0,0 +1 @@
fix default `_missing_` so a duplicate `ValueError` is not set as the `__context__` of the original `ValueError`