Игнорировать необратимые предметы при травлении

У меня есть довольно уникальный случай, когда моя программа на Python генерирует большое количество динамического кода (такого как динамически генерируемые классы и лямбда-выражения), и ей нужно сохранить свое состояние с помощью Pickle. Я хотел бы сохранить как можно больше, но допустимо просто не сохранять объекты, которые невозможно исправить.

Другими словами, я хотел бы иметь возможность мариновать mydict, который содержит некоторые непробиваемые объекты, просто выполнив del mydict[unpickleablekey] для каждого неприметного объекта.

Какой самый простой и самый Pythonic способ реализовать это?

1 ответ

Я столкнулся с аналогичной проблемой при попытке сериализации JSON с экземплярами, которые не могли быть засечены. Я написал собственный кодер JSON, который может помочь в вашем случае.

from json import JSONEncoder
class JsonEncoder(JSONEncoder):
    def default(self, obj):
        return repr(obj)

Тогда вы бы использовали это так:

encoded_dict = JsonEncoder().encode(mydict)
with open('dump.pkl', 'w') as f:
    pickle.dump(encoded_dict, f)

Чтобы прочитать это обратно:

import json
with open('dump.pkl', 'r') as f:
    decoded_dict = json.loads(pickle.load(f))

Следует отметить, что при использовании repr для кодирования значений такие вещи, как целочисленные значения или значения с плавающей точкой, будут преобразованы в строковое представление, а не в истинный тип. Кодировщик по умолчанию может быть улучшен, чтобы возвращать repr, только если тип не int, float и т.д...

Другие вопросы по тегам