[Python-checkins] bpo-35899: Fix Enum handling of empty and weird strings (GH-11891)

Miss Islington (bot) webhook-mailer at python.org
Fri Mar 8 16:44:28 EST 2019


https://github.com/python/cpython/commit/8755f0aeb67125a154e5665a24276fe85d269d85
commit: 8755f0aeb67125a154e5665a24276fe85d269d85
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2019-03-08T13:44:21-08:00
summary:

bpo-35899: Fix Enum handling of empty and weird strings (GH-11891)


Co-authored-by: Maxwell <maxwellpxt at gmail.com>
Co-authored-by: Stéphane Wirtel <stephane at wirtel.be>

https://bugs.python.org/issue35899
(cherry picked from commit 8b914d2767acba3a9e78f1dacdc2d61dbfd7e304)

Co-authored-by: Brennan D Baraban <34765317+bdbaraban at users.noreply.github.com>

files:
A Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst
M Lib/enum.py
M Lib/test/test_enum.py

diff --git a/Lib/enum.py b/Lib/enum.py
index 8984cac60955..5e97a9e8d810 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -25,18 +25,19 @@ def _is_descriptor(obj):
 
 def _is_dunder(name):
     """Returns True if a __dunder__ name, False otherwise."""
-    return (name[:2] == name[-2:] == '__' and
-            name[2:3] != '_' and
-            name[-3:-2] != '_' and
-            len(name) > 4)
+    return (len(name) > 4 and
+            name[:2] == name[-2:] == '__' and
+            name[2] != '_' and
+            name[-3] != '_')
 
 
 def _is_sunder(name):
     """Returns True if a _sunder_ name, False otherwise."""
-    return (name[0] == name[-1] == '_' and
+    return (len(name) > 2 and
+            name[0] == name[-1] == '_' and
             name[1:2] != '_' and
-            name[-2:-1] != '_' and
-            len(name) > 2)
+            name[-2:-1] != '_')
+
 
 def _make_class_unpicklable(cls):
     """Make the given class un-picklable."""
@@ -156,7 +157,7 @@ def __new__(metacls, cls, bases, classdict):
         _order_ = classdict.pop('_order_', None)
 
         # check for illegal enum names (any others?)
-        invalid_names = set(enum_members) & {'mro', }
+        invalid_names = set(enum_members) & {'mro', ''}
         if invalid_names:
             raise ValueError('Invalid enum member name: {0}'.format(
                 ','.join(invalid_names)))
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index fdc3dd9c38a0..29a429ccd998 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -2738,6 +2738,23 @@ def cycle_enum():
         self.assertEqual(256, len(seen), 'too many composite members created')
 
 
+class TestEmptyAndNonLatinStrings(unittest.TestCase):
+
+    def test_empty_string(self):
+        with self.assertRaises(ValueError):
+            empty_abc = Enum('empty_abc', ('', 'B', 'C'))
+
+    def test_non_latin_character_string(self):
+        greek_abc = Enum('greek_abc', ('\u03B1', 'B', 'C'))
+        item = getattr(greek_abc, '\u03B1')
+        self.assertEqual(item.value, 1)
+
+    def test_non_latin_number_string(self):
+        hebrew_123 = Enum('hebrew_123', ('\u05D0', '2', '3'))
+        item = getattr(hebrew_123, '\u05D0')
+        self.assertEqual(item.value, 1)
+
+
 class TestUnique(unittest.TestCase):
 
     def test_unique_clean(self):
diff --git a/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst
new file mode 100644
index 000000000000..73d4fa17b33d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst
@@ -0,0 +1 @@
+Enum has been fixed to correctly handle empty strings and strings with non-Latin characters (ie. 'α', 'א') without crashing. Original patch contributed by Maxwell. Assisted by Stéphane Wirtel.



More information about the Python-checkins mailing list