def parse_value(cls, value, cast):
        """Parse and cast provided value

        :param value: Stringed value.
        :param cast: Type to cast return value as.

        :returns: Casted value
        """
        if cast is None:
            return value
        elif cast is bool:
            try:
                value = int(value) != 0
            except ValueError:
                value = value.lower() in cls.BOOLEAN_TRUE_STRINGS
        elif isinstance(cast, list):
            value = list(map(cast[0], [x for x in value.split(',') if x]))
        elif isinstance(cast, tuple):
            val = value.strip('(').strip(')').split(',')
            value = tuple(map(cast[0], [x for x in val if x]))
        elif isinstance(cast, dict):
            key_cast = cast.get('key', str)
            value_cast = cast.get('value', str)
            value_cast_by_key = cast.get('cast', dict())
            value = dict(map(
                lambda kv: (
                    key_cast(kv[0]),
                    cls.parse_value(kv[1], value_cast_by_key.get(kv[0], value_cast))
                ),
                [val.split('=') for val in value.split(';') if val]
            ))
        elif cast is dict:
            value = dict([val.split('=') for val in value.split(',') if val])
        elif cast is list:
            value = [x for x in value.split(',') if x]
        elif cast is tuple:
            val = value.strip('(').strip(')').split(',')
            value = tuple([x for x in val if x])
        elif cast is float:
            # clean string
            float_str = re.sub(r'[^\d,\.]', '', value)
            # split for avoid thousand separator and different locale comma/dot symbol
            parts = re.split(r'[,\.]', float_str)
            if len(parts) == 1:
                float_str = parts[0]
            else:
                float_str = "{0}.{1}".format(''.join(parts[0:-1]), parts[-1])
            value = float(float_str)
        else:
            value = cast(value)
        return value
def parse_value ( cls , value , cast ) : if cast is None : return value elif cast is bool : try : value = int ( value ) != 0 except ValueError : value = value . lower ( ) in cls . BOOLEAN_TRUE_STRINGS elif isinstance ( cast , list ) : value = list ( map ( cast [ 0 ] , [ x for x in value . split ( ',' ) if x ] ) ) elif isinstance ( cast , tuple ) : val = value . strip ( '(' ) . strip ( ')' ) . split ( ',' ) value = tuple ( map ( cast [ 0 ] , [ x for x in val if x ] ) ) elif isinstance ( cast , dict ) : key_cast = cast . get ( 'key' , str ) value_cast = cast . get ( 'value' , str ) value_cast_by_key = cast . get ( 'cast' , dict ( ) ) value = dict ( map ( lambda kv : ( key_cast ( kv [ 0 ] ) , cls . parse_value ( kv [ 1 ] , value_cast_by_key . get ( kv [ 0 ] , value_cast ) ) ) , [ val . split ( '=' ) for val in value . split ( ';' ) if val ] ) ) elif cast is dict : value = dict ( [ val . split ( '=' ) for val in value . split ( ',' ) if val ] ) elif cast is list : value = [ x for x in value . split ( ',' ) if x ] elif cast is tuple : val = value . strip ( '(' ) . strip ( ')' ) . split ( ',' ) value = tuple ( [ x for x in val if x ] ) elif cast is float : float_str = re . sub ( r'[^\d,\.]' , '' , value ) parts = re . split ( r'[,\.]' , float_str ) if len ( parts ) == 1 : float_str = parts [ 0 ] else : float_str = "{0}.{1}" . format ( '' . join ( parts [ 0 : - 1 ] ) , parts [ - 1 ] ) value = float ( float_str ) else : value = cast ( value ) return value
Parse and cast provided value

        :param value: Stringed value.
        :param cast: Type to cast return value as.

        :returns: Casted value