name for new Enum decorator

2QdxY4RzWzUUiLuE at potatochowder.com 2QdxY4RzWzUUiLuE at potatochowder.com
Fri May 28 00:06:13 EDT 2021


On 2021-05-27 at 20:23:29 -0700,
Regarding "name for new Enum decorator,"
Ethan Furman <ethan at stoneleaf.us> 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?

Exhaustive?

I see two qualitatively different kinds of enums:  those that can/should
be "or"ed together (e.g., RED, GREEN) and those that cannot (e.g.,
FIRST_ROUND, FIRST_CEIL, and FIRST_TRUNC).  The idea of a "missing"
value doesn't seem to apply to the second type (because defining
FIRST_TRUNC as FIRST_ROUND | FIRST_CEIL is nonsensical).  I don't quite
know what that may or may not suggest as far as names go, but it may
give someone else an idea.


More information about the Python-list mailing list