Falsey Enums

Ethan Furman ethan at stoneleaf.us
Fri Jul 28 10:24:24 EDT 2017


On 07/28/2017 01:13 AM, Ben Finney wrote:
> Ethan Furman writes:

>> class X(Enum):
>> Falsey = 0
>> Truthy = 1
>> Fakey = 2
>> def __bool__(self):
>> return bool(self.value)
>> I am surprised this is not already the behaviour of an Enum class,
> without overriding the ‘__bool__’ method.
>> What would be a good reason not to have this behaviour by default for
> ‘Enum.__bool__’? (i.e. if this were reported as a bug on the ‘enum.Enum’
> implementation, what would be good reasons not to fix it?)

It matches the docs. ;)
 https://docs.python.org/3/library/enum.html#boolean-value-of-enum-classes-and-members
 Enum members that are mixed with non-Enum types (such as int, str, etc.)
 are evaluated according to the mixed-in type’s rules; otherwise, all
 members evaluate as True. To make your own Enum’s boolean evaluation
 depend on the member’s value add the following to your class:
 Enum classes always evaluate as True.
The rationale is in PEP 435, in the functional API section.
 The reason for defaulting to 1 as the starting number and not 0 is that 0 is False
 in a boolean sense, but enum members all evaluate to True .
Which still begs the question of: why? According to memory, and as Rustom guessed, an Enum member is a thing, and all 
things in Python default to being True. If `bool(thing) == False` is a desirable characteristic then extra steps must 
be taken. Either:
- subclass a type that already has that characteristic, such as int or float, or
- add your own __bool__ method (__nonzero__ in Python 2)
Looked at another way: The value attribute is just that -- an attribute. Depending on the use-case that attribute can 
be irrelevant (which is why we have auto(), etc.), so by default Enum does not use the .value attribute in figuring out 
if a member is something vs nothing (or truthy vs falsey).
--
~Ethan~


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /