String Enum in Python
Bare Python enum is not good enough: Int representation may be efficient, but it is not human readable, especially after it is serialized.
Wouldn’t it be nice to have a string enum? Multiple inheritance to the resque!
from enum import Enum
from typing import Union
class Color( str, Enum ):
red = 'Red'
green = 'Green'
blue = 'Blue'
black = 'Black'
@classmethod
def is_dark( cls, st: Union[ str, 'Color' ] ) -> bool:
return st in [ cls.black ]
@classmethod
def is_primary( cls, st: Union[ str, 'Color' ] ) -> bool:
return st in [ cls.red, cls.green, cls.black ]
@classmethod
def is_valid( cls, st: Union[ str, 'Color' ] ) -> bool:
return st in Color._value2member_map_
def __repr__( s ):
'To enable Color serialization as a string...'
return repr( s.value )
Let’s see how this works for Color user…
>>> r = Color.red
>>> r == 'Red'
True
>>> r == 'red'
False
>>> r
'Red'
>>> Color.is_primary( r )
True
>>> Color.is_primary( 'Red' )
True
>>> j = { 'color': r }
>>> j
{'color': 'Red'}
>>> print( j )
{'color': 'Red'}
I like it much more than bare enums!