mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-105497: [Enum] Fix Flag inversion when alias/mask members exist. (GH-105542)
When inverting a Flag member (or boundary STRICT), only consider other canonical flags; when inverting an IntFlag member (or boundary KEEP), also consider aliases.
This commit is contained in:
parent
8e755923c9
commit
59f009e589
3 changed files with 47 additions and 8 deletions
15
Lib/enum.py
15
Lib/enum.py
|
@ -1439,12 +1439,11 @@ class Flag(Enum, boundary=STRICT):
|
|||
else:
|
||||
pseudo_member._name_ = None
|
||||
# use setdefault in case another thread already created a composite
|
||||
# with this value, but only if all members are known
|
||||
# note: zero is a special case -- add it
|
||||
if not unknown:
|
||||
pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member)
|
||||
if neg_value is not None:
|
||||
cls._value2member_map_[neg_value] = pseudo_member
|
||||
# with this value
|
||||
# note: zero is a special case -- always add it
|
||||
pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member)
|
||||
if neg_value is not None:
|
||||
cls._value2member_map_[neg_value] = pseudo_member
|
||||
return pseudo_member
|
||||
|
||||
def __contains__(self, other):
|
||||
|
@ -1520,8 +1519,8 @@ class Flag(Enum, boundary=STRICT):
|
|||
# use all bits
|
||||
self._inverted_ = self.__class__(~self._value_)
|
||||
else:
|
||||
# calculate flags not in this member
|
||||
self._inverted_ = self.__class__(self._flag_mask_ ^ self._value_)
|
||||
# use canonical bits (i.e. calculate flags not in this member)
|
||||
self._inverted_ = self.__class__(self._singles_mask_ ^ self._value_)
|
||||
if isinstance(self._inverted_, self.__class__):
|
||||
self._inverted_._inverted_ = self
|
||||
return self._inverted_
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue