8000 gh-101541: [Enum] create flag psuedo-member without calling original … · python/cpython@ef7c2bf · GitHub
[go: up one dir, main page]

Skip to content

Commit ef7c2bf

Browse files
authored
gh-101541: [Enum] create flag psuedo-member without calling original __new__ (GH-101590)
1 parent d3e2dd6 commit ef7c2bf

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

Lib/enum.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,12 +1429,11 @@ def _missing_(cls, value):
14291429
% (cls.__name__, value, unknown, bin(unknown))
14301430
)
14311431
# normal Flag?
1432-
__new__ = getattr(cls, '__new_member__', None)
1433-
if cls._member_type_ is object and not __new__:
1432+
if cls._member_type_ is object:
14341433
# construct a singleton enum pseudo-member
14351434
pseudo_member = object.__new__(cls)
14361435
else:
1437-
pseudo_member = (__new__ or cls._member_type_.__new__)(cls, value)
1436+
pseudo_member = cls._member_type_.__new__(cls, value)
14381437
if not hasattr(pseudo_member, '_value_'):
14391438
pseudo_member._value_ = value
14401439
if member_value:

Lib/test/test_enum.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,6 +2855,46 @@ class NTEnum(Enum):
28552855
[TTuple(id=0, a=0, blist=[]), TTuple(id=1, a=2, blist=[4]), TTuple(id=2, a=4, blist=[0, 1, 2])],
28562856
)
28572857

2858+
def test_flag_with_custom_new(self):
2859+
class FlagFromChar(IntFlag):
2860+
def __new__(cls, c):
2861+
value = 1 << c
2862+
self = int.__new__(cls, value)
2863+
self._value_ = value
2864+
return self
2865+
#
2866+
a = ord('a')
2867+
#
2868+
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
2869+
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
2870+
#
2871+
#
2872+
class FlagFromChar(Flag):
2873+
def __new__(cls, c):
2874+
value = 1 << c
2875+
self = object.__new__(cls)
2876+
self._value_ = value
2877+
return self
2878+
#
2879+
a = ord('a')
2880+
z = 1
2881+
#
2882+
self.assertEqual(FlagFromChar.a.value, 158456325028528675187087900672)
2883+
self.assertEqual((FlagFromChar.a|FlagFromChar.z).value, 158456325028528675187087900674)
2884+
#
2885+
#
2886+
class FlagFromChar(int, Flag, boundary=KEEP):
2887+
def __new__(cls, c):
2888+
value = 1 << c
2889+
self = int.__new__(cls, value)
2890+
self._value_ = value
2891+
return self
2892+
#
2893+
a = ord('a')
2894+
#
2895+
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
2896+
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
2897+
28582898
class TestOrder(unittest.TestCase):
28592899
"test usage of the `_order_` attribute"
28602900

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[Enum] - fix psuedo-flag creation

0 commit comments

Comments
 (0)
0