Встречался ли с Serializable в Python?

«Встречался ли с Serializable в Python?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в контексте Python под Serializable обычно понимают объекты, которые можно сериализовать — то есть преобразовать в поток байтов для сохранения или передачи. В Python это реализуется с помощью модулей pickle или json.

Ключевые моменты:

  • pickle: Основной модуль для сериализации объектов Python. Не все объекты сериализуемы (например, открытые файлы или соединения с БД).
  • Протокол __getstate__ и __setstate__: Позволяют кастомизировать процесс сериализации/десериализации для сложных объектов.

Пример сериализации пользовательского класса:

import pickle

class DataPoint:
    def __init__(self, x, y, label):
        self.x = x
        self.y = y
        self.label = label

    # При необходимости можно определить, как объект будет сериализован
    def __getstate__(self):
        state = self.__dict__.copy()
        # Например, можно не сериализовать вычисляемое поле
        # del state['computed_field']
        return state

    def __setstate__(self, state):
        self.__dict__.update(state)

# Создание и сериализация объекта
point = DataPoint(10, 20, "A")
serialized = pickle.dumps(point)

# Десериализация
deserialized_point = pickle.loads(serialized)
print(deserialized_point.x, deserialized_point.label)  # 10 A

На практике с этим сталкиваешься при кэшировании объектов на диск, использовании многопроцессорной обработки (multiprocessing) или работе с распределёнными системами вроде Apache Spark (где функции, передаваемые в rdd.map(), должны быть сериализуемыми).