Kaydet (Commit) 8b914d27 authored tarafından Brennan D Baraban's avatar Brennan D Baraban Kaydeden (comit) Miss Islington (bot)

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

Co-authored-by: 's avatarMaxwell <maxwellpxt@gmail.com>
Co-authored-by: 's avatarStéphane Wirtel <stephane@wirtel.be>





https://bugs.python.org/issue35899
üst 8b50400f
...@@ -19,18 +19,19 @@ def _is_descriptor(obj): ...@@ -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): ...@@ -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): ...@@ -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):
......
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.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment