[Python-Dev] Enum, Flag, contains, and False vs TypeError (original) (raw)

Barry Warsaw barry at python.org
Wed Apr 4 15:40:09 EDT 2018


On Apr 4, 2018, at 11:32, Ethan Furman <ethan at stoneleaf.us> wrote:

(A) A standard Enum class is a container of Enum members. It cannot hold anything else. However, it has been returning False both in cases where the in-question object was an Enum of a different class (a Fruit in a Color, for example) and when the in-question object was not even an Enum ('apple' in Fruit, for example). (B) The waters get even more muddied when Fruit has a str mixin, so Fruit.APPLE == 'apple' is True -- in that case, should 'orange' in Fruit return True, False, or raise TypeError?

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

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. 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).

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

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

Cheers, -Barry

-------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: Message signed with OpenPGP URL: <http://mail.python.org/pipermail/python-dev/attachments/20180404/d41b6810/attachment.sig>



More information about the Python-Dev mailing list