mirror of https://github.com/python/cpython
gh-101541: [Enum] create flag psuedo-member without calling original __new__ (GH-101590)
This commit is contained in:
parent
d3e2dd6e71
commit
ef7c2bfcf1
|
@ -1429,12 +1429,11 @@ class Flag(Enum, boundary=CONFORM):
|
||||||
% (cls.__name__, value, unknown, bin(unknown))
|
% (cls.__name__, value, unknown, bin(unknown))
|
||||||
)
|
)
|
||||||
# normal Flag?
|
# normal Flag?
|
||||||
__new__ = getattr(cls, '__new_member__', None)
|
if cls._member_type_ is object:
|
||||||
if cls._member_type_ is object and not __new__:
|
|
||||||
# construct a singleton enum pseudo-member
|
# construct a singleton enum pseudo-member
|
||||||
pseudo_member = object.__new__(cls)
|
pseudo_member = object.__new__(cls)
|
||||||
else:
|
else:
|
||||||
pseudo_member = (__new__ or cls._member_type_.__new__)(cls, value)
|
pseudo_member = cls._member_type_.__new__(cls, value)
|
||||||
if not hasattr(pseudo_member, '_value_'):
|
if not hasattr(pseudo_member, '_value_'):
|
||||||
pseudo_member._value_ = value
|
pseudo_member._value_ = value
|
||||||
if member_value:
|
if member_value:
|
||||||
|
|
|
@ -2855,6 +2855,46 @@ class TestSpecial(unittest.TestCase):
|
||||||
[TTuple(id=0, a=0, blist=[]), TTuple(id=1, a=2, blist=[4]), TTuple(id=2, a=4, blist=[0, 1, 2])],
|
[TTuple(id=0, a=0, blist=[]), TTuple(id=1, a=2, blist=[4]), TTuple(id=2, a=4, blist=[0, 1, 2])],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_flag_with_custom_new(self):
|
||||||
|
class FlagFromChar(IntFlag):
|
||||||
|
def __new__(cls, c):
|
||||||
|
value = 1 << c
|
||||||
|
self = int.__new__(cls, value)
|
||||||
|
self._value_ = value
|
||||||
|
return self
|
||||||
|
#
|
||||||
|
a = ord('a')
|
||||||
|
#
|
||||||
|
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
|
||||||
|
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
class FlagFromChar(Flag):
|
||||||
|
def __new__(cls, c):
|
||||||
|
value = 1 << c
|
||||||
|
self = object.__new__(cls)
|
||||||
|
self._value_ = value
|
||||||
|
return self
|
||||||
|
#
|
||||||
|
a = ord('a')
|
||||||
|
z = 1
|
||||||
|
#
|
||||||
|
self.assertEqual(FlagFromChar.a.value, 158456325028528675187087900672)
|
||||||
|
self.assertEqual((FlagFromChar.a|FlagFromChar.z).value, 158456325028528675187087900674)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
class FlagFromChar(int, Flag, boundary=KEEP):
|
||||||
|
def __new__(cls, c):
|
||||||
|
value = 1 << c
|
||||||
|
self = int.__new__(cls, value)
|
||||||
|
self._value_ = value
|
||||||
|
return self
|
||||||
|
#
|
||||||
|
a = ord('a')
|
||||||
|
#
|
||||||
|
self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
|
||||||
|
self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
|
||||||
|
|
||||||
class TestOrder(unittest.TestCase):
|
class TestOrder(unittest.TestCase):
|
||||||
"test usage of the `_order_` attribute"
|
"test usage of the `_order_` attribute"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
[Enum] - fix psuedo-flag creation
|
Loading…
Reference in New Issue