Skip to content
Permalink
Browse files

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
(cherry picked from commit 8b914d2)

Co-authored-by: Brennan D Baraban <34765317+bdbaraban@users.noreply.github.com>
  • Loading branch information...
miss-islington and bdbaraban committed Mar 8, 2019
1 parent 02351ed commit 8755f0aeb67125a154e5665a24276fe85d269d85
Showing with 27 additions and 8 deletions.
  1. +9 −8 Lib/enum.py
  2. +17 −0 Lib/test/test_enum.py
  3. +1 −0 Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst
@@ -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)))
@@ -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):
@@ -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.

0 comments on commit 8755f0a

Please sign in to comment.
You can’t perform that action at this time.