"復帰"デコレータを持つクラスを作成しました。クラスメンバーを歩留まりに変更し、すべての変更を「元に戻す」ために例外が発生した場合、その意図があります。 :ロールバックの目的でクラスデコレータを作成する方法はありますか?
class A():
def __init__(self):
self.kuku = 'old_value'
@contextmanager
def revertible_transaction(self):
old_self = deepcopy(self)
try:
yield
except Exception as e:
self = old_self
raise e
def change_stuff(self):
with self.revertible_transaction():
self.kuku = 'new_value'
raise Exception
私はchange_stuff()を実行した後にself.kukuはまだ 'OLD_VALUE' になりたいが、それは代わりに 'NEW_VALUE' です。
なぜこれが機能しないのか、これを正しく行うにはどうすればよいですか?
'self = old_self'は実際にオブジェクトを変更しません。 [Pythonでの割り当ての仕組み](https://nedbatchelder.com/text/names.html)を読んでください。 – user2357112