Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.3k
Closed
Description
With code such as:
importenumclassFlag(enum.Flag):A=0x01B=0x02Mask=0xffprint(~Flag.A)
Python 3.10.11 printsFlag.B, and so does Python 3.11.3. However, with Python 3.11.4, this happens instead:
Traceback (most recent call last): File"/home/florian/tmp/f.py", line9, in<module>print(~Flag.A)^^^^^^^ File"/usr/lib/python3.11/enum.py", line1542, in__invert__self._inverted_=self.__class__(self._flag_mask_^self._value_)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File"/usr/lib/python3.11/enum.py", line711, in__call__returncls.__new__(cls, value)^^^^^^^^^^^^^^^^^^^^^^^ File"/usr/lib/python3.11/enum.py", line1136, in__new__raise exc File"/usr/lib/python3.11/enum.py", line1113, in__new__ result=cls._missing_(value)^^^^^^^^^^^^^^^^^^^^ File"/usr/lib/python3.11/enum.py", line1454, in_missing_raiseValueError('%r: no members with value%r'% (cls, unknown))ValueError:<flag 'Flag'>: no members with value 252
As a workaround, a detour via.value works in this case:
>>>Flag((Flag.A|Flag.B).value&~Flag.A.value)<Flag.B:2>
This causes issues with PyQt, which has the following flags (as bindings from C++):
>>>fromPyQt6.QtCoreimportQt>>>foreinQt.KeyboardModifier:...print(f"{e.name} ={hex(e.value)}")...NoModifier=0x0ShiftModifier=0x2000000ControlModifier=0x4000000AltModifier=0x8000000MetaModifier=0x10000000KeypadModifier=0x20000000GroupSwitchModifier=0x40000000KeyboardModifierMask=0xfe000000
(Output from Python 3.10 - with Python 3.11,KeyboardModifierMask goes missing in the output, and so doesFlag.Mask above, but that seems like a different issue?)
With my project, I'mtrying to remove a modifier from the given flags. With Python 3.10.11 and 3.11.3:
>>> (Qt.KeyboardModifier.ShiftModifier|Qt.KeyboardModifier.ControlModifier)&~Qt.KeyboardModifier.ControlModifier<KeyboardModifier.ShiftModifier:33554432>
But with Python 3.11.4, same issue as above:
>>> from PyQt6.QtCore import Qt>>> (Qt.KeyboardModifier.ShiftModifier | Qt.KeyboardModifier.ControlModifier) & ~Qt.KeyboardModifier.ControlModifierTraceback (most recent call last): File"<stdin>", line1, in<module> File"/usr/lib/python3.11/enum.py", line1542, in__invert__self._inverted_=self.__class__(self._flag_mask_^self._value_)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File"/usr/lib/python3.11/enum.py", line711, in__call__returncls.__new__(cls, value)^^^^^^^^^^^^^^^^^^^^^^^ File"/usr/lib/python3.11/enum.py", line1136, in__new__raise exc File"/usr/lib/python3.11/enum.py", line1113, in__new__ result=cls._missing_(value)^^^^^^^^^^^^^^^^^^^^ File"/usr/lib/python3.11/enum.py", line1454, in_missing_raiseValueError('%r: no members with value%r'% (cls, unknown))ValueError:<flag 'KeyboardModifier'>: no members with value 2147483648
As a culprit, I suspect:
- enum.CONFORM behavior breaks backwards compatibility #103365
- gh-103365: [Enum] STRICT boundary corrections #103494
- [3.11] gh-103365: [Enum] STRICT boundary corrections (GH-103494) #103513
Linked PRs
- gh-105497: [Enum] Fix flag inversion when alias/mask members exist. #105542
- [3.11] gh-105497: [Enum] Fix Flag inversion when alias/mask members exist. (GH-105542) #105571
- [3.12] gh-105497: [Enum] Fix Flag inversion when alias/mask members exist. (GH-105542) #105572
- gh-105497: [Enum] Fix flag mask inversion when unnamed flags exist #106468
- [3.12] gh-105497: [Enum] Fix flag mask inversion when unnamed flags exist (GH-106468) #106620
- [3.11] gh-105497: [Enum] Fix flag mask inversion when unnamed flags exist (GH-106468) #106621
Metadata
Metadata
Assignees
Labels
Projects
Status
Done