summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrennan D Baraban <34765317+bdbaraban@users.noreply.github.com>2019-03-03 22:09:11 (GMT)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-03-03 22:09:11 (GMT)
commit8b914d2767acba3a9e78f1dacdc2d61dbfd7e304 (patch)
treea06002f1635e1b5d312451509075fb3ea9cb03aa
parent8b50400fbe607ef558d6c0033efa697c99417507 (diff)
downloadcpython-8b914d2767acba3a9e78f1dacdc2d61dbfd7e304.zip
cpython-8b914d2767acba3a9e78f1dacdc2d61dbfd7e304.tar.gz
cpython-8b914d2767acba3a9e78f1dacdc2d61dbfd7e304.tar.bz2
bpo-35899: Fix Enum handling of empty and weird strings (GH-11891)
Co-authored-by: Maxwell <maxwellpxt@gmail.com> Co-authored-by: Stéphane Wirtel <stephane@wirtel.be> https://bugs.python.org/issue35899
-rw-r--r--Lib/enum.py17
-rw-r--r--Lib/test/test_enum.py17
-rw-r--r--Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst1
3 files changed, 27 insertions, 8 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index a958ed8..6ef17c7 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -19,18 +19,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."""
@@ -150,7 +151,7 @@ class EnumMeta(type):
_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 99fc850..770decf 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -2730,6 +2730,23 @@ class TestIntFlag(unittest.TestCase):
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 0000000..73d4fa1
--- /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.