persistent
persistent copied to clipboard
Option to prevent storage of non-persistent mutable objects
An important bit of ZODB fine print and, for some, a common pitfall is the persistence rule that if you store non-persistent subobjects, you need to take special case, possibly inviting bugs.
I think it would be useful to enforce a restriction to only storing persistent or immutable objects. Amongts the ways to do this:
-
White list known immutable objects, with a way to add objects to the white list. A possible way to whitelist custom objects might be to use an ABC. I suspect that a static white list would address 98% of cases. We might want to create some new immutable objects, like linked lists.
-
Inspect types for mutators (e.g. setattr, setitem). I can see this becomming a maintenance burden.
I agree with this idea, non-persistence of objects (eg. imported from/to json and yaml) is a scary thing,
I developed lot of utilities to constantly check my DB (especially since some methods of Persistent* objects returned non-persistent types), but it remains dangerous. ---> https://github.com/ChrysalisTeam/pychronia/blob/7a9efef62da3451e1aa22efbe4c6ca0568dddf96/pychronia_game/utilities/init.py#L205
Having safeguards against this, built in ZODB, would be awesome.
(See https://github.com/zopefoundation/persistent/issues/112 for a nasty case where persistence can be lost unknowingly)