Предпосылка : учитывая объект Python obj
, я хочу передать его некоторой случайной функции, и, когда функция будет завершена, мне понадобится опция для сброса obj
в исходное состояние.государство.Кроме того, в obj
не может быть внесено никаких реальных изменений, поскольку другой код может по-прежнему хотеть получить доступ к его исходному состоянию.
Оптимальное решение должно быть быстрым в обычном случае, когда большое obj
только слегка изменен.Производительность для необычного случая, когда obj
необходимо откатить, менее важна.
Эти требования ортогональны решению грубой силы простого копирования объекта: в общем случае это было бы смехотворно медленным,и очень быстрый для необычного отката.
Решение должно, как правило, позволить коду, работающему с объектом, обрабатывать его как обычный объект.Это включает в себя присвоение ему всевозможных атрибутов, включая пользовательские классы.Очевидно, что решение должно учитывать все дерево объектов.Некоторые уступки могут быть необходимы.Примеры ограничений, которые я рассматривал в своих решениях, до сих пор включают требование, чтобы все неосновные типы наследовались от специального базового класса, запрещение диктов и списков в обмен на кортежи, собственный класс dict и т. Д. Могут быть приемлемы большие тайны.
Я работал над этим некоторое время и хотел бы узнать, какие идеи и предложения могут иметь более опытные мастера Python.
Редактировать: ответ Фреда заставил меня осознать пропущенное требование: нельзя вносить изменения в исходный
obj
, поскольку исходное состояние также ценно.