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 <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2022-06-01 16:19:27 +02:00
parent 7b9c099321
commit 21bcc7ce98
2 changed files with 13 additions and 4 deletions

View File

@ -106,6 +106,9 @@ class EnumMember:
def __repr__(self): def __repr__(self):
return '<%s%s (%d)>' % (self.enum.name + '.' if self.enum.name else '', self.name, self.value) 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? # numeric operations: delegate to int. Do we really need any of those?
def __add__(self, other): def __add__(self, other):
return self.value.__add__(other.value if isinstance(other, EnumMember) else other) return self.value.__add__(other.value if isinstance(other, EnumMember) else other)
@ -242,7 +245,7 @@ class Enum(dict):
name = '' name = ''
def __init__(self, name='', parent=None, **kwds): def __init__(self, name='', parent=None, **kwds):
super(Enum, self).__init__() super().__init__()
if isinstance(name, (dict, Enum)) and parent is None: if isinstance(name, (dict, Enum)) and parent is None:
# swap if only parent is given as positional argument # swap if only parent is given as positional argument
name, parent = '', name name, parent = '', name
@ -309,17 +312,17 @@ class Enum(dict):
try: try:
return self[key] return self[key]
except KeyError as e: except KeyError as e:
raise AttributeError(str(e)) raise AttributeError(str(e)) from None
def __setattr__(self, key, value): def __setattr__(self, key, value):
if self.name and key != 'name': if self.name and key != 'name':
raise TypeError('Enum %r can not be changed!' % self.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): def __setitem__(self, key, value):
if self.name: if self.name:
raise TypeError('Enum %r can not be changed!' % 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): def __delitem__(self, key):
raise TypeError('Enum %r can not be changed!' % self.name) raise TypeError('Enum %r can not be changed!' % self.name)

View File

@ -77,3 +77,9 @@ def test_Enum():
assert e3.c >= e2.a assert e3.c >= e2.a
assert e3.b <= e2.b assert e3.b <= e2.b
assert Enum({'self': 0, 'other': 1})('self') == 0 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