]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.9] bpo-39728: Enum: fix duplicate `ValueError` (GH-22277) (GH-22282)
authorEthan Furman <ethan@stoneleaf.us>
Thu, 17 Sep 2020 00:37:51 +0000 (17:37 -0700)
committerGitHub <noreply@github.com>
Thu, 17 Sep 2020 00:37:51 +0000 (17:37 -0700)
fix default `_missing_` to return `None` instead of raising a `ValueError`
Co-authored-by: Andrey Darascheka <andrei.daraschenka@leverx.com>
(cherry picked from commit c95ad7a91fbd7636f33a098d3b39964ab083bf49)

Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Lib/enum.py
Lib/test/test_enum.py
Misc/ACKS
Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst [new file with mode: 0644]

index da5a31f0b88acb2460d3dbcfe6b852e74b6b34de..ebadd9f662a13894013c29c2c0abfb1759c811d8 100644 (file)
@@ -628,7 +628,7 @@ class Enum(metaclass=EnumMeta):
 
     @classmethod
     def _missing_(cls, value):
-        raise ValueError("%r is not a valid %s" % (value, cls.__qualname__))
+        return None
 
     def __repr__(self):
         return "<%s.%s: %r>" % (
index 6f547165acfee38a752821f611f8149284732d62..0e6b1b16ca323827900d79c64d513924c834fb6e 100644 (file)
@@ -1832,6 +1832,18 @@ class TestEnum(unittest.TestCase):
             third = auto()
         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):
         class Color(Enum):
             red = 1
@@ -1850,7 +1862,12 @@ class TestEnum(unittest.TestCase):
                     # trigger not found
                     return None
         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:
             Color('bad return')
         except TypeError as exc:
index 2a180eb67cc5c337e86ad7b871b2c4019e3bc83e..5e0953ae91b1889e25aa580d281a4b3ddd2d245d 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -432,6 +432,7 @@ Marcos Donolo
 Dima Dorfman
 Yves Dorfsman
 Michael Dorman
+Andrey Doroschenko
 Steve Dower
 Allen Downey
 Cesar Douady
diff --git a/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst b/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst
new file mode 100644 (file)
index 0000000..beb2016
--- /dev/null
@@ -0,0 +1 @@
+fix default `_missing_` so a duplicate `ValueError` is not set as the `__context__` of the original `ValueError`