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

Skip to content

Commit cf8973c

Browse files
gh-101541: [Enum] create flag psuedo-member without calling original __new__ (GH-101590)
(cherry picked from commit ef7c2bf) Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
1 parent 6ae8032 commit cf8973c

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
@@ -1430,12 +1430,11 @@ def _missing_(cls, value):
14301430
% (cls.__name__, value, unknown, bin(unknown))
14311431
)
14321432
# normal Flag?
1433-
__new__ = getattr(cls, '__new_member__', None)
1434-
if cls._member_type_ is object and not __new__:
1433+
if cls._member_type_ is object:
14351434
# construct a singleton enum pseudo-member
14361435
pseudo_member = object.__new__(cls)
14371436
else:
1438-
pseudo_member = (__new__ or cls._member_type_.__new__)(cls, value)
1437+
pseudo_member = cls._member_type_.__new__(cls, value)
14391438
if not hasattr(pseudo_member, '_value_'):
14401439
pseudo_member._value_ = value
14411440
if member_value:

Lib/test/test_enum.py

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

2744+
def test_flag_with_custom_new(self):
2745+
class FlagFromChar(IntFlag):
2746+
def __new__(cls, c):
2747+
value = 1 << c
2748+
self = int.__new__(cls, value)
2749+
self._value_ = value
2750+
return self
2751+
#
2752+
a = ord('a')
2753+
#
2754+
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
2755+
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
2756+
#
2757+
#
2758+
class FlagFromChar(Flag):
2759+
def __new__(cls, c):
2760+
value = 1 << c
2761+
self = object.__new__(cls)
2762+
self._value_ = value
2763+
return self
2764+
#
2765+
a = ord('a')
2766+
z = 1
2767+
#
2768+
self.assertEqual(FlagFromChar.a.value, 158456325028528675187087900672)
2769+
self.assertEqual((FlagFromChar.a|FlagFromChar.z).value, 158456325028528675187087900674)
2770+
#
2771+
#
2772+
class FlagFromChar(int, Flag, boundary=KEEP):
2773+
def __new__(cls, c):
2774+
value = 1 << c
2775+
self = int.__new__(cls, value)
2776+
self._value_ = value
2777+
return self
2778+
#
2779+
a = ord('a')
2780+
#
2781+
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
2782+
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
2783+
27442784
class TestOrder(unittest.TestCase):
27452785
"test usage of the `_order_` attribute"
27462786

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