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
This commit is contained in:
parent
8b50400fbe
commit
8b914d2767
17
Lib/enum.py
17
Lib/enum.py
|
@ -19,18 +19,19 @@ def _is_descriptor(obj):
|
||||||
|
|
||||||
def _is_dunder(name):
|
def _is_dunder(name):
|
||||||
"""Returns True if a __dunder__ name, False otherwise."""
|
"""Returns True if a __dunder__ name, False otherwise."""
|
||||||
return (name[:2] == name[-2:] == '__' and
|
return (len(name) > 4 and
|
||||||
name[2:3] != '_' and
|
name[:2] == name[-2:] == '__' and
|
||||||
name[-3:-2] != '_' and
|
name[2] != '_' and
|
||||||
len(name) > 4)
|
name[-3] != '_')
|
||||||
|
|
||||||
|
|
||||||
def _is_sunder(name):
|
def _is_sunder(name):
|
||||||
"""Returns True if a _sunder_ name, False otherwise."""
|
"""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[1:2] != '_' and
|
||||||
name[-2:-1] != '_' and
|
name[-2:-1] != '_')
|
||||||
len(name) > 2)
|
|
||||||
|
|
||||||
def _make_class_unpicklable(cls):
|
def _make_class_unpicklable(cls):
|
||||||
"""Make the given class un-picklable."""
|
"""Make the given class un-picklable."""
|
||||||
|
@ -150,7 +151,7 @@ class EnumMeta(type):
|
||||||
_order_ = classdict.pop('_order_', None)
|
_order_ = classdict.pop('_order_', None)
|
||||||
|
|
||||||
# check for illegal enum names (any others?)
|
# check for illegal enum names (any others?)
|
||||||
invalid_names = set(enum_members) & {'mro', }
|
invalid_names = set(enum_members) & {'mro', ''}
|
||||||
if invalid_names:
|
if invalid_names:
|
||||||
raise ValueError('Invalid enum member name: {0}'.format(
|
raise ValueError('Invalid enum member name: {0}'.format(
|
||||||
','.join(invalid_names)))
|
','.join(invalid_names)))
|
||||||
|
|
|
@ -2730,6 +2730,23 @@ class TestIntFlag(unittest.TestCase):
|
||||||
self.assertEqual(256, len(seen), 'too many composite members created')
|
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):
|
class TestUnique(unittest.TestCase):
|
||||||
|
|
||||||
def test_unique_clean(self):
|
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.
|
Loading…
Reference in New Issue