On Tue, Mar 12, 2013 at 2:31 PM, Alex Stewart <span dir="ltr"><<a href="mailto:foogod@gmail.com" target="_blank">foogod@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>Regarding the issue of bitmask-enums, I do agree that they are common enough in various APIs that it is important that we be able to support them easily.  <i>However,</i> I have yet to see how or why they are actually different than int-enums in any practical way.  I don't see why we need to treat them as a different category at all and I see no value in doing so.  They're all just<i> </i>int-enums.  Problem solved.</div>
</blockquote><div><br></div><div>It just occurred to me that as I was skimming some of the previous discussion and I was also coming from the perspective of my own implementation, which has not yet been shared with the rest of the group, this response may have been overly terse and not really communicated what I meant very well.</div>
<div><br></div><div>For clarification:  I believe that what we're fundamentally talking about here is the question of "compounding" enum values into what are effectively multi-enum sets (they are not really the same thing anymore as a single enum value, because they do not have a one-to-one correspondence with any one enum value).  With ints, this compounding operation is typically a "binary or" operation.  This is what we call "bitmasks", but really they're just a particular way of compounding ints together.</div>
<div><br></div><div>In my opinion, the concept of "compound enum" is a larger abstract concept that could, and probably should, apply to any type of enum, not just ints.  In that context, bitmasks are really nothing special, they are just the compound form of int-enums:</div>
<div><br></div><div>class Color (Enum):</div><div>    RED, GREEN, BLUE = __ * 3</div><div><br></div><div>class WxStyle (IntEnum):</div><div>    RESIZE_BORDER = 64</div><div>    MAXIMIZE_BOX = 512</div><div><br></div><div>
>>> x = Color.RED | Color.BLUE</div><div>>>> repr(x)</div><div>'Color.RED | Color.BLUE'</div><div>>>> Color.RED in x</div><div>True</div><div>>>> Color.GREEN in x</div><div>False</div>
<div>>>> type(x)</div><div><class 'enum.CompoundEnum'></div><div><div>>>> int(x)</div><div>Traceback (most recent call last):</div><div>  File "<stdin>", line 1, in <module></div>
<div>TypeError: int() argument must be a string or a number, not 'CompoundEnum'</div></div><div><br></div><div>>>> x = WxStyle.MAXIMIZE_BOX | WxStyle.RESIZE_BORDER</div><div>>>> repr(x)</div><div>
WxStyle.MAXIMIZE_BOX | WxStyle.RESIZE_BORDER</div><div>>>> WxStyle.MAXIMIZE_BOX in x</div><div>True</div><div><div>>>> type(x)</div><div><class 'enum.CompoundIntEnum'></div><div></div><div>
>>> int(x)</div><div>576</div></div><div><br></div><div>(This may become a bit clearer when you guys can all see the implementation I've been coding up)</div><div><br></div><div>--Alex</div></div>