[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: Python 3.11.4 breaks inverting flags
From: Florian Bruhin <me () the-compiler ! org>
Date: 2023-06-08 12:44:03
Message-ID: 168622824377.368515.18346683898246243936 () aragog ! localdomain
[Download RAW message or body]
Hey,
It looks like Python 3.11.4 breaks inverting of enum.Flag when there is
a "mask" member set (like e.g. with Qt.KeyboardModifier).
With Python 3.11.3:
>>> combined = Qt.KeyboardModifier.ShiftModifier | Qt.KeyboardModifier.ControlModifier
>>> combined & ~Qt.KeyboardModifier.ControlModifier
<KeyboardModifier.ShiftModifier: 33554432>
But with 3.11.4:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.11/enum.py", line 1542, in __invert__
self._inverted_ = self.__class__(self._flag_mask_ ^ self._value_)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/enum.py", line 711, in __call__
return cls.__new__(cls, value)
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/enum.py", line 1136, in __new__
raise exc
File "/usr/lib/python3.11/enum.py", line 1113, in __new__
result = cls._missing_(value)
^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/enum.py", line 1454, in _missing_
raise ValueError('%r: no members with value %r' % (cls, unknown))
ValueError: <flag 'KeyboardModifier'>: no members with value 2147483648
As a (rather annoying) workaround, a detour via int works:
>>> Qt.KeyboardModifier(combined.value & ~Qt.KeyboardModifier.ControlModifier.value)
<KeyboardModifier.ShiftModifier: 33554432>
It seems to be a Python issue, as it's trivially reproducable with:
import enum
class Flag(enum.Flag):
A = 0x01
B = 0x02
Mask = 0xff
print(~Flag.A)
I opened an issue against CPython:
https://github.com/python/cpython/issues/105497
Florian
[Attachment #3 (application/pgp-signature)]
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic