]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
bpo-38250: [Enum] single-bit flags are canonical (GH-24215)
authorEthan Furman <ethan@stoneleaf.us>
Mon, 25 Jan 2021 22:26:19 +0000 (14:26 -0800)
committerGitHub <noreply@github.com>
Mon, 25 Jan 2021 22:26:19 +0000 (14:26 -0800)
commit7aaeb2a3d682ecba125c33511e4b4796021d2f82
tree8c1e5658baf6db140b24368f62cefd61363ac55e
parent9852cb38112a4f8d11e26c3423643ea994d5a14f
bpo-38250: [Enum] single-bit flags are canonical (GH-24215)

Flag members are now divided by one-bit verses multi-bit, with multi-bit being treated as aliases. Iterating over a flag only returns the contained single-bit flags.

Iterating, repr(), and str() show members in definition order.

When constructing combined-member flags, any extra integer values are either discarded (CONFORM), turned into ints (EJECT) or treated as errors (STRICT). Flag classes can specify which of those three behaviors is desired:

>>> class Test(Flag, boundary=CONFORM):
...     ONE = 1
...     TWO = 2
...
>>> Test(5)
<Test.ONE: 1>

Besides the three above behaviors, there is also KEEP, which should not be used unless necessary -- for example, _convert_ specifies KEEP as there are flag sets in the stdlib that are incomplete and/or inconsistent (e.g. ssl.Options). KEEP will, as the name suggests, keep all bits; however, iterating over a flag with extra bits will only return the canonical flags contained, not the extra bits.

Iteration is now in member definition order.  If member definition order
matches increasing value order, then a more efficient method of flag
decomposition is used; otherwise, sort() is called on the results of
that method to get definition order.

``re`` module:

repr() has been modified to support as closely as possible its previous
output; the big difference is that inverted flags cannot be output as
before because the inversion operation now always returns the comparable
positive result; i.e.

   re.A|re.I|re.M|re.S is ~(re.L|re.U|re.S|re.T|re.DEBUG)

in both of the above terms, the ``value`` is 282.

re's tests have been updated to reflect the modifications to repr().
Doc/library/enum.rst
Lib/enum.py
Lib/re.py
Lib/test/test_enum.py
Lib/test/test_re.py
Lib/types.py
Misc/ACKS
Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst [new file with mode: 0644]