Игнорировать необратимые предметы при травлении
У меня есть довольно уникальный случай, когда моя программа на 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 и т.д...