From 8b914d2767acba3a9e78f1dacdc2d61dbfd7e304 Mon Sep 17 00:00:00 2001 From: Brennan D Baraban <34765317+bdbaraban@users.noreply.github.com> Date: Sun, 3 Mar 2019 14:09:11 -0800 Subject: bpo-35899: Fix Enum handling of empty and weird strings (GH-11891) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Maxwell Co-authored-by: Stéphane Wirtel https://bugs.python.org/issue35899 --- Lib/enum.py | 17 +++++++++-------- Lib/test/test_enum.py | 17 +++++++++++++++++ .../Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst | 1 + 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst 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. -- cgit v0.12