revert change 87a9dff5106c: pure Enum members again evaluate to True;
update Finer Points section of docs to cover boolean evaluation; add more tests for pure and mixed boolean evaluation
This commit is contained in:
parent
43cfd8240c
commit
60255b67b9
|
@ -257,7 +257,7 @@ members are not integers (but see `IntEnum`_ below)::
|
||||||
>>> Color.red < Color.blue
|
>>> Color.red < Color.blue
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
File "<stdin>", line 1, in <module>
|
File "<stdin>", line 1, in <module>
|
||||||
TypeError: '<' not supported between instances of 'Color' and 'Color'
|
TypeError: unorderable types: Color() < Color()
|
||||||
|
|
||||||
Equality comparisons are defined though::
|
Equality comparisons are defined though::
|
||||||
|
|
||||||
|
@ -747,6 +747,15 @@ besides the :class:`Enum` member you looking for::
|
||||||
|
|
||||||
.. versionchanged:: 3.5
|
.. versionchanged:: 3.5
|
||||||
|
|
||||||
|
Boolean evaluation: Enum classes that are mixed with non-Enum types (such as
|
||||||
|
:class:`int`, :class:`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::
|
||||||
|
|
||||||
|
def __bool__(self):
|
||||||
|
return bool(self._value_)
|
||||||
|
|
||||||
The :attr:`__members__` attribute is only available on the class.
|
The :attr:`__members__` attribute is only available on the class.
|
||||||
|
|
||||||
If you give your :class:`Enum` subclass extra methods, like the `Planet`_
|
If you give your :class:`Enum` subclass extra methods, like the `Planet`_
|
||||||
|
|
|
@ -482,9 +482,6 @@ class Enum(metaclass=EnumMeta):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s.%s" % (self.__class__.__name__, self._name_)
|
return "%s.%s" % (self.__class__.__name__, self._name_)
|
||||||
|
|
||||||
def __bool__(self):
|
|
||||||
return bool(self._value_)
|
|
||||||
|
|
||||||
def __dir__(self):
|
def __dir__(self):
|
||||||
added_behavior = [
|
added_behavior = [
|
||||||
m
|
m
|
||||||
|
|
|
@ -272,11 +272,26 @@ class TestEnum(unittest.TestCase):
|
||||||
_any_name_ = 9
|
_any_name_ = 9
|
||||||
|
|
||||||
def test_bool(self):
|
def test_bool(self):
|
||||||
|
# plain Enum members are always True
|
||||||
class Logic(Enum):
|
class Logic(Enum):
|
||||||
true = True
|
true = True
|
||||||
false = False
|
false = False
|
||||||
self.assertTrue(Logic.true)
|
self.assertTrue(Logic.true)
|
||||||
self.assertFalse(Logic.false)
|
self.assertTrue(Logic.false)
|
||||||
|
# unless overridden
|
||||||
|
class RealLogic(Enum):
|
||||||
|
true = True
|
||||||
|
false = False
|
||||||
|
def __bool__(self):
|
||||||
|
return bool(self._value_)
|
||||||
|
self.assertTrue(RealLogic.true)
|
||||||
|
self.assertFalse(RealLogic.false)
|
||||||
|
# mixed Enums depend on mixed-in type
|
||||||
|
class IntLogic(int, Enum):
|
||||||
|
true = 1
|
||||||
|
false = 0
|
||||||
|
self.assertTrue(IntLogic.true)
|
||||||
|
self.assertFalse(IntLogic.false)
|
||||||
|
|
||||||
def test_contains(self):
|
def test_contains(self):
|
||||||
Season = self.Season
|
Season = self.Season
|
||||||
|
|
Loading…
Reference in New Issue