import abc

class MyBaseLabel(abc.ABC):
    @abc.abstractmethod
    def _int2str_item(self, int_inp):
        pass
    
    @abc.abstractmethod
    def _str2int_item(self, str_inp):
        pass
    
    def int2str(self, _input):
        if isinstance(_input, list):
            return [self._int2str_item(item) for item in _input]
        return self._int2str_item(_input)
    
    def str2int(self, _input):
        if isinstance(_input, list):
            return [self._str2int_item(item) for item in _input]
        return self._str2int_item(_input)

class MyDummyLabel(MyBaseLabel):
    def _int2str_item(self, int_inp):
        return int_inp
    
    def _str2int_item(self, str_inp):
        return str_inp
    
class MyClassLabel(MyBaseLabel):
    def __init__(self, names):
        self.names = names
    
    def _int2str_item(self, int_inp):
        return self.names[int_inp]
    
    def _str2int_item(self, str_inp):
        if str_inp not in self.names:
            return None
        return self.names.index(str_inp)
    
class MyRegresionLabel(MyBaseLabel):
    def _int2str_item(self, int_inp):
        return "%.1f" % round(int_inp, 1)
    
    def _str2int_item(self, str_inp):
        try:
            return float(str_inp)
        except ValueError as ex:
            return None