On 04/04/2018 12:40 PM, Barry Warsaw wrote:
On Apr 4, 2018, at 11:32, Ethan Furman wrote:

(A) A standard Enum class is a container of Enum members.  It cannot hold 
anything else...

(B) The waters get even more muddied when Fruit has a str mixin, so 
`Fruit.APPLE == 'apple' is True`...

Are you proposing to change current behavior, and if so, what’s your 
deprecation plan?

The first problem is to determine what the correct behavior should be -- if that turns out to be different than what is we can then decide the time frame for changing it. ;)

I’m not sure I feel that the purity is important enough to change how it
> currently works, especially since you’ll have to be prepared to catch
> exceptions rather than just handle the boolean value.

It's not so much about purity as about bugs not passing silently. But whether or not it's a bug depends on how "containerish" an Enum class is (or is perceived to be).

OTOH, since most of my
> use cases are comparisons against explicit enum values, I’m not sure how often
> people write code to check for enum values contained in the Enum (I do it in
> one or two places where I’m deserializing the actual value object, e.g. from a
> pickle).

I write a bunch of cli scripts for work, so I'm often comparing a string value with an Enum value. As often as not, I don't need the member itself, just to know that the string I have can be converted to a valid Enum -- `if "quick" in Method`, for example -- but just converting to an Enum is undoubtedly the better course of action .

(FWIW, I encourage individual comparisons use `is` rather than `==`.)

Which is great for pure Enums, not so much for mixed.

Question 2:
----------

(A) The new Flag type allows `in` tests on the members themselves; so, for 
example:

--> SomeFlag.ONE in SomeFlag.One|SomeFlag.TWO
True

The question, of course, is what to do when a non-Flag member is tested for:

--> 'apple' in SomeFlag.ONE
# False or TypeError?

--> 2 in SomeFlag.TWO
# True or TypeError?

(B) And, of course, the same muddier question arises with IntFlag, where 
SomeFlag.TWO == 2 is True.

Well, now I’m confused:

Python 3.7.0b2+ (heads/3.7:f328caf4ca, Mar 26 2018, 19:57:33)
[Clang 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
--> from enum import IntFlag
--> class Flag(IntFlag):
...   a = 1
...   b = 2
...   c = 4
...   d = 8
...
--> 'foo' in (Flag.a|Flag.b)
True

Already being tracked at https://bugs.python.org/issue33217, which is what got me thinking about this whole issue. True is obviously wrong, but should the correct answer be False, or TypeError?

--
~Ethan~
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to