[Python-ideas] PEP XXX - Competitor with PEP 435: Adding an enum type to the Python standard library

Andrew Barnert abarnert at yahoo.com
Wed Mar 13 02:58:23 CET 2013


> From: Random832 <random832 at fastmail.us>

> Sent: Tuesday, March 12, 2013 6:03 PM
> Subject: Re: [Python-ideas] PEP XXX - Competitor with PEP 435: Adding an enum type to the Python standard library
> 
> On 03/12/2013 06:17 PM, Alex Stewart wrote:
>>  effectively multi-enum sets
> Speaking of sets... it seems like sets of single enum values would be a good way 
> to represent "ORed-together enums". But then if you want a function to 
> accept one, it has to be able to not care if it's only a single one or not.
> 
> So, what if each value of a 'flags' type enum is also able to be treated 
> as a single-member set of itself? We already have one object that iterates into 
> a sequence the same class: strings, so there's nothing wrong with that 
> _conceptually_.


That means that in order to make a window non-resizable, instead of this:

    window.style &= ~wx.RESIZE_BORDER

you do this:

    window.style -= wx.RESIZE_BORDER

Right? (IIRC, the actual code is probably something like "window.setStyle(window.getStyle() & ~wx.RESIZE_BORDER)", but I think we can ignore that; the issue is the same.)

That solves the problem of how to represent ~wx.RESIZE_BORDER, etc. But it creates a new problem.

Now non-bitmask integral Enum constants don't have integral-type operators, but set-type operators. So "FRIDAY - WEDNESDAY" returns "FRIDAY" (because it's set difference), and "WEDNESDAY < FRIDAY" is false (because it's not a proper subset)?

So I think this means you _do_ need separate types for bitmasked and ordered int values—or, alternatively, for set-able and non-set-able Enums, which I think Alex Stewart was able to eliminate.

> The constructor could turn a sequence of the enum into a proper instance of it 

> [if needed to get the int value] for passing into functions that require one,

Well, you need to be able to get the int value of a set, too. What's the point of being able to do mmap.PROT_READ | mmap.PROT_WRITE if I (or the mmap module) can't turn that into a 3?

Also, what happens if you call the constructor on a sequence of more than one instance?




More information about the Python-ideas mailing list