Here is how you can validate values with helper functions:
For the Enums:
class Customers(IntEnum):
ABC = 1
FOO = 2
JDI = 3
class Clients(IntEnum):
ALICE = 1
BOB = 2
PETER = 3
Implement helper functions:
from enum import IntEnum, EnumMeta
def isEnumClass(o) -> bool:
return type(o) == EnumMeta
def isEnumMember(o) -> bool:
return type(o).__class__ == EnumMeta
def enumHasMember(en, o, int_val:bool=False) -> bool:
assert isEnumClass(en),\
"param en is not an Enum class. Got %s!" \
% ('(none)' if en is None else type(o).__name__)
if type(o) == int:
if not int_val: return False
return len([m.value for m in en if m.value == o]) == 1
else:
return not o is None and o.__class__ == en
Usage:
print("1: %s" % enumHasMember(Customers, Customers.ABC))
print("2: %s" % enumHasMember(Customers, 1, int_val=False))
print("3: %s" % enumHasMember(Customers, 1, int_val=True))
print("4: %s" % enumHasMember(Customers, 4, int_val=True))
print("5: %s" % enumHasMember(Customers, Clients.ALICE))
> 1: True
> 2: False
> 3: True
> 4: False
> 5: False
Alternatively, if you control all of the code, you can create create a classmethod for a custom IntEnu class:
from enum import IntEnum, EnumMeta
class MyIntEnum(IntEnum):
@classmethod
def hasMember(cls, o, strict:bool=True) -> bool:
if type(o) == int:
if strict: return False
return len([m.value for m in cls if m.value == o]) == 1
else:
return not o is None and o.__class__ == cls
class Clients(MyIntEnum):
ALICE = 1
BOB = 2
PETER = 3
CHERYL = 4
LARRY = 5
class Customers(MyIntEnum):
ABC = 1
FOO = 2
JDI = 3
Usage:
print("1: %s" % Customers.hasMember(Customers.ABC))
print("2: %s" % Customers.hasMember(1))
print("3: %s" % Customers.hasMember(1, strict=False))
print("4: %s" % Customers.hasMember(4, strict=False))
print("5: %s" % Customers.hasMember(Clients.ALICE))
> 1: True
> 2: False
> 3: True
> 4: False
> 5: False
Another handy class method would be validate method for a one line hard assertion:
class MyIntEnum(IntEnum):
...
@classmethod
def validate(cls, alias:str, o, strict:bool=True):
assertNotBlank('alias', alias)
assert cls.hasMember(o, strict),\
f"Argument '{alias}' is not a member of MyIntEnum {cls.__module__}.{type(cls).__name__}. Got: {dump(o, True)}"
return o
Please let me know if there is any issue with the above design. Just started researching this myself.