On Thu, 2021-05-27 at 20:24 -0700, Ethan Furman wrote:
> Greetings!
> 
> The Flag type in the enum module has had some improvements, but I find it 
> necessary to move one of those improvements 
> into a decorator instead, and I'm having a hard time thinking up a name.
> 
> What is the behavior?  Well, a name in a flag type can be either canonical 
> (it represents one thing), or aliased (it 
> represents two or more things).  To use Color as an example:
> 
>      class Color(Flag):
>          RED = 1                        # 0001
>          GREEN = 2                      # 0010
>          BLUE = 4                       # 0100
>          PURPLE = RED | BLUE            # 0101
>          WHITE = RED | GREEN | BLUE     # 0111
> 
> The flags RED, GREEN, and BLUE are all canonical, while PURPLE and WHITE are 
> aliases for certain flag combinations.  But 
> what if we have something like:
> 
>      class Color(Flag):
>          RED = 1            # 0001
>          BLUE = 4           # 0100
>          WHITE = 7          # 0111
> 
> As you see, WHITE is an "alias" for a value that does not exist in the Flag 
> (0010, or 2).  That seems like it's probably 
> an error.  But what about this?
> 
>      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.
> 
> So, like the enum.unique decorator that can be used when duplicate names 
> should be an error, I'm adding a new decorator 
> to verify that a Flag has no missing aliased values that can be used when the 
> programmer thinks it's appropriate... but 
> I have no idea what to call it.
> 
> Any nominations?
> 

Maybe something like the following would be a good starting point:

@bitmask_require_individual_bits

-- 
Best regards,
Michał Górny


_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/PPPCZGMDH47UPGH6RKVXNQQX3IQ2AMCS/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to