On 5/29/2021 6:33 PM, Nick Coghlan wrote:
On Sat, 29 May 2021, 7:27 am Ethan Furman, <ethan@stoneleaf.us> wrote:
On 5/28/21 12:43 AM, Petr Viktorin wrote:
 > On 28. 05. 21 5:24, Ethan Furman wrote:

 >>      class FlagWithMasks(IntFlag):
 >>          DEFAULT = 0x0
 >>
 >>          FIRST_MASK = 0xF
 >>          FIRST_ROUND = 0x0
 >>          FIRST_CEIL = 0x1
 >>          FIRST_TRUNC = 0x2
 >>
 >>          SECOND_MASK = 0xF0
 >>          SECOND_RECALC = 0x00
 >>          SECOND_NO_RECALC = 0x10
 >>
 >>          THIRD_MASK = 0xF00
 >>          THIRD_DISCARD = 0x000
 >>          THIRD_KEEP = 0x100
 >>
 >> Here we have three flags (FIRST_MASK, SECOND_MASK, THIRD_MASK) that are aliasing values
 >> that don't exist, but it seems intentional and not an error.
 >
 > Are you looking for a decorator for the whole Enum, or a way to mark individual *values* as masks?

The decorator is for whole enum.  The issue is not that some values are masks, but whether the absence of named bits
covered by the mask is an error.


If you were prepared to incur a deprecation period, then you could make the decorator "@allow_masks" and flip the default behaviour to emit Deprecation Warning for masks, eventually upgrading it to Value Error.

Otherwise, maybe something like "@no_masks"?

"Mask" is one typical usage for combined flags, but not the only one.  I would not recommend using "mask" in the name of the decorator.