Skip to content

Commit c95ad7a

Browse files
authored
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>
1 parent 83f6dcd commit c95ad7a

File tree

4 files changed

+21
-2
lines changed

4 files changed

+21
-2
lines changed

Lib/enum.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ def _generate_next_value_(name, start, count, last_values):
629629

630630
@classmethod
631631
def _missing_(cls, value):
632-
raise ValueError("%r is not a valid %s" % (value, cls.__qualname__))
632+
return None
633633

634634
def __repr__(self):
635635
return "<%s.%s: %r>" % (

Lib/test/test_enum.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -1845,6 +1845,18 @@ class Dupes(Enum):
18451845
third = auto()
18461846
self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes))
18471847

1848+
def test_default_missing(self):
1849+
class Color(Enum):
1850+
RED = 1
1851+
GREEN = 2
1852+
BLUE = 3
1853+
try:
1854+
Color(7)
1855+
except ValueError as exc:
1856+
self.assertTrue(exc.__context__ is None)
1857+
else:
1858+
raise Exception('Exception not raised.')
1859+
18481860
def test_missing(self):
18491861
class Color(Enum):
18501862
red = 1
@@ -1863,7 +1875,12 @@ def _missing_(cls, item):
18631875
# trigger not found
18641876
return None
18651877
self.assertIs(Color('three'), Color.blue)
1866-
self.assertRaises(ValueError, Color, 7)
1878+
try:
1879+
Color(7)
1880+
except ValueError as exc:
1881+
self.assertTrue(exc.__context__ is None)
1882+
else:
1883+
raise Exception('Exception not raised.')
18671884
try:
18681885
Color('bad return')
18691886
except TypeError as exc:

Misc/ACKS

+1
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ Marcos Donolo
433433
Dima Dorfman
434434
Yves Dorfsman
435435
Michael Dorman
436+
Andrey Doroschenko
436437
Steve Dower
437438
Allen Downey
438439
Cesar Douady
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fix default `_missing_` so a duplicate `ValueError` is not set as the `__context__` of the original `ValueError`

0 commit comments

Comments
 (0)