Skip to content

Commit ec09973

Browse files
authored
bpo-43744: [Enum] fix _is_private (GH-25349)
``_is_private`` now returns ``False`` instead of raising an exception when enum name matches beginning of class name as used in a private variable
1 parent 0dca5eb commit ec09973

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

Lib/enum.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ def _is_sunder(name):
5353
def _is_private(cls_name, name):
5454
# do not use `re` as `re` imports `enum`
5555
pattern = '_%s__' % (cls_name, )
56+
pat_len = len(pattern)
5657
if (
57-
len(name) >= 5
58+
len(name) > pat_len
5859
and name.startswith(pattern)
59-
and name[len(pattern)] != '_'
60+
and name[pat_len:pat_len+1] != ['_']
6061
and (name[-1] != '_' or name[-2] != '_')
6162
):
6263
return True

Lib/test/test_enum.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3395,6 +3395,31 @@ class Sillier(IntEnum):
33953395
triple = 3
33963396
value = 4
33973397

3398+
class TestHelpers(unittest.TestCase):
3399+
3400+
sunder_names = '_bad_', '_good_', '_what_ho_'
3401+
dunder_names = '__mal__', '__bien__', '__que_que__'
3402+
private_names = '_MyEnum__private', '_MyEnum__still_private'
3403+
private_and_sunder_names = '_MyEnum__private_', '_MyEnum__also_private_'
3404+
random_names = 'okay', '_semi_private', '_weird__', '_MyEnum__'
3405+
3406+
def test_sunder(self):
3407+
for name in self.sunder_names + self.private_and_sunder_names:
3408+
self.assertTrue(enum._is_sunder(name), '%r is a not sunder name?' % name)
3409+
for name in self.dunder_names + self.private_names + self.random_names:
3410+
self.assertFalse(enum._is_sunder(name), '%r is a sunder name?' % name)
3411+
3412+
def test_dunder(self):
3413+
for name in self.dunder_names:
3414+
self.assertTrue(enum._is_dunder(name), '%r is a not dunder name?' % name)
3415+
for name in self.sunder_names + self.private_names + self.private_and_sunder_names + self.random_names:
3416+
self.assertFalse(enum._is_dunder(name), '%r is a dunder name?' % name)
3417+
3418+
def test_is_private(self):
3419+
for name in self.private_names + self.private_and_sunder_names:
3420+
self.assertTrue(enum._is_private('MyEnum', name), '%r is a not private name?')
3421+
for name in self.sunder_names + self.dunder_names + self.random_names:
3422+
self.assertFalse(enum._is_private('MyEnum', name), '%r is a private name?')
33983423

33993424
class TestEnumTypeSubclassing(unittest.TestCase):
34003425
pass
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
fix issue with enum member name matching the start of a private variable
2+
name

0 commit comments

Comments
 (0)