[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
- Previous message (by thread): [Python-Dev] Enum, Flag, __contains__, and False vs TypeError
- Next message (by thread): [Python-Dev] Enum, Flag, __contains__, and False vs TypeError
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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>
- Previous message (by thread): [Python-Dev] Enum, Flag, __contains__, and False vs TypeError
- Next message (by thread): [Python-Dev] Enum, Flag, __contains__, and False vs TypeError
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]