On Jan 30, 2013, at 03:16 PM, Michael Foord wrote:

>Being an int subclass (and possibly optionally a strs subclass) is a
>requirement if any adopted Enum is to be used *within* the standard library
>in places where integers are currently used as "poor man's enums". I also
>don't *think* flufl.enum supports flag enums (ones that can be OR'd
>together), right?

Sure, it does because you have to be explicit about the enum int value to
assign the item. �This doesn't bother me because the syntax is clear, I almost
always want an explicit int value anyway, inheritance is supported, and as you
comment, flag values are (mostly) easy to support.

class Colors(Enum):
� � red = 1
� � green = 2
� � blue = 3

class MoreColors(Colors):
� � cyan = 4
� � magenta = 5
� � # chartreuse = 2 would be an error

class Flags(Enum):
� � beautiful = 1
� � fast = 2
� � elegant = 4
� � wonderful = 8


Now, it's true that because Flags.fast is not an int, it must be explicitly
converted to an int, e.g. `int(Flags.fast)`. �That doesn't bother me.

What does bother me is that Enum doesn't support automatic conversion to int
for OR and AND, so you have to do this:

>>> int(Flags.fast) | int(Flags.elegant)
6

That should be easy enough to fix by adding the appropriate operators so that
you could do:

>>> Flags.fast | Flags.elegant
6

Returning an int from such operations is the only sensible interpretation.

https://bugs.launchpad.net/flufl.enum/+bug/1110501

As far as autonumbering goes, I think we could support that in Python 3.3+,
though I don't have any brilliant ideas on syntax. �A couple of suggestions
are in this bug:

https://bugs.launchpad.net/flufl.enum/+bug/1110507

e.g

class Colors(Enum):
� � red = None
� � green = None
� � blue = None

or

from flufl.enum import Enum, auto
class Colors(Enum):
� � red = auto
� � green = auto
� � blue = auto

I'm definitely open to suggestions here!

Barry, since you've obviously given this issue a lot of thought, maybe you could summarize it in a PEP so we have a clear way of moving forward for 3.4 ?
">

(original) (raw)

On Wed, Jan 30, 2013 at 7:35 AM, Barry Warsaw <barry@python.org> wrote:
On Jan 30, 2013, at 03:16 PM, Michael Foord wrote:

\>Being an int subclass (and possibly optionally a strs subclass) is a
\>requirement if any adopted Enum is to be used \*within\* the standard library
\>in places where integers are currently used as "poor man's enums". I also
\>don't \*think\* flufl.enum supports flag enums (ones that can be OR'd
\>together), right?

Sure, it does because you have to be explicit about the enum int value to
assign the item. �This doesn't bother me because the syntax is clear, I almost
always want an explicit int value anyway, inheritance is supported, and as you
comment, flag values are (mostly) easy to support.

class Colors(Enum):
� � red = 1
� � green = 2
� � blue = 3

class MoreColors(Colors):
� � cyan = 4
� � magenta = 5
� � # chartreuse = 2 would be an error

class Flags(Enum):
� � beautiful = 1
� � fast = 2
� � elegant = 4
� � wonderful = 8


Now, it's true that because Flags.fast is not an int, it must be explicitly
converted to an int, e.g. \`int(Flags.fast)\`. �That doesn't bother me.

What does bother me is that Enum doesn't support automatic conversion to int
for OR and AND, so you have to do this:

\>>> int(Flags.fast) | int(Flags.elegant)
6

That should be easy enough to fix by adding the appropriate operators so that
you could do:

\>>> Flags.fast | Flags.elegant
6

Returning an int from such operations is the only sensible interpretation.

https://bugs.launchpad.net/flufl.enum/+bug/1110501

As far as autonumbering goes, I think we could support that in Python 3.3+,
though I don't have any brilliant ideas on syntax. �A couple of suggestions
are in this bug:

https://bugs.launchpad.net/flufl.enum/+bug/1110507

e.g

class Colors(Enum):
� � red = None
� � green = None
� � blue = None

or

from flufl.enum import Enum, auto
class Colors(Enum):
� � red = auto
� � green = auto
� � blue = auto

I'm definitely open to suggestions here!

Barry, since you've obviously given this issue a lot of thought, maybe you could summarize it in a PEP so we have a clear way of moving forward for 3.4 ?


Eli