From 21bcc7ce981c954fa24282396abfe683b0b3875f Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Wed, 1 Jun 2022 16:19:27 +0200 Subject: [PATCH] an enum with value 0 should be interpreted as False for example: bool(Enum(off=0, on=1)('off')) is False Change-Id: Ieb200b4ecf0eed50b657ecc00f73a69810ad828f Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28586 Tested-by: Jenkins Automated Tests Reviewed-by: Enrico Faulhaber Reviewed-by: Markus Zolliker --- secop/lib/enum.py | 11 +++++++---- test/test_lib_enum.py | 6 ++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/secop/lib/enum.py b/secop/lib/enum.py index 0fb0b38..2bdcf1c 100644 --- a/secop/lib/enum.py +++ b/secop/lib/enum.py @@ -106,6 +106,9 @@ class EnumMember: def __repr__(self): return '<%s%s (%d)>' % (self.enum.name + '.' if self.enum.name else '', self.name, self.value) + def __bool__(self): + return bool(self.value) + # numeric operations: delegate to int. Do we really need any of those? def __add__(self, other): return self.value.__add__(other.value if isinstance(other, EnumMember) else other) @@ -242,7 +245,7 @@ class Enum(dict): name = '' def __init__(self, name='', parent=None, **kwds): - super(Enum, self).__init__() + super().__init__() if isinstance(name, (dict, Enum)) and parent is None: # swap if only parent is given as positional argument name, parent = '', name @@ -309,17 +312,17 @@ class Enum(dict): try: return self[key] except KeyError as e: - raise AttributeError(str(e)) + raise AttributeError(str(e)) from None def __setattr__(self, key, value): if self.name and key != 'name': raise TypeError('Enum %r can not be changed!' % self.name) - super(Enum, self).__setattr__(key, value) + super().__setattr__(key, value) def __setitem__(self, key, value): if self.name: raise TypeError('Enum %r can not be changed!' % self.name) - super(Enum, self).__setitem__(key, value) + super().__setitem__(key, value) def __delitem__(self, key): raise TypeError('Enum %r can not be changed!' % self.name) diff --git a/test/test_lib_enum.py b/test/test_lib_enum.py index 97228e1..7077834 100644 --- a/test/test_lib_enum.py +++ b/test/test_lib_enum.py @@ -77,3 +77,9 @@ def test_Enum(): assert e3.c >= e2.a assert e3.b <= e2.b assert Enum({'self': 0, 'other': 1})('self') == 0 + + +def test_Enum_bool(): + e = Enum('OffOn', off=0, on=1) + assert bool(e(0)) is False + assert bool(e(1)) is True