def map_python_type(cls, value): from pyignite.datatypes import ( MapObject, ObjectArrayObject, BinaryObject, ) if cls._python_map is None: cls._init_python_map() if cls._python_array_map is None: cls._init_python_array_map() value_type = type(value) if is_iterable(value) and value_type is not str: value_subtype = cls.get_subtype(value) if value_subtype in cls._python_array_map: return cls._python_array_map[value_subtype] # a little heuristics (order may be important) if all([ value_subtype is None, len(value) == 2, isinstance(value[0], int), isinstance(value[1], dict), ]): return MapObject if all([ value_subtype is None, len(value) == 2, isinstance(value[0], int), is_iterable(value[1]), ]): return ObjectArrayObject raise TypeError( 'Type `array of {}` is invalid'.format(value_subtype) ) if is_binary(value): return BinaryObject if value_type in cls._python_map: return cls._python_map[value_type] raise TypeError( 'Type `{}` is invalid.'.format(value_type) )
def map_python_type(cls, value): if cls._python_map is None or cls._python_array_map is None: cls._init_python_mapping() value_type = type(value) if value_type in cls._python_map: return cls._python_map[value_type] if is_iterable(value) and value_type not in (str, bytearray, bytes): value_subtype = cls.get_subtype(value) if value_subtype in cls._python_array_map: return cls._python_array_map[value_subtype] # a little heuristics (order is important) if all([ value_subtype is None, len(value) == 2, isinstance(value[0], int), isinstance(value[1], dict), ]): return cls._map_obj_type if all([ value_subtype is None, len(value) == 2, isinstance(value[0], int), is_iterable(value[1]), ]): return cls._collection_obj_type # no default for ObjectArrayObject, sorry raise TypeError( 'Type `array of {}` is invalid'.format(value_subtype)) if is_binary(value): return cls._binary_obj_type raise TypeError('Type `{}` is invalid.'.format(value_type))