Unset a global Property

I am storing a FloatProperty for scenes by setting it on bpy.types.Scene to be saved with the .blend file:

bpy.types.Scene.foo = bpy.props.FloatProperty(/*...*/)

The twist here is that the default value I provide comes from an addon preferences value. It seems I can update this default value by just setting bpy.types.Scene.foo again:

def updateDefault(self, context: bpy.types.Context):
    bpy.types.Scene.foo = bpy.props.FloatProperty(default = self.theDefault)

class MyAddonPrefs(bpy.types.AddonPreferences):
    bl_idname = "my_addon"
    theDefault: bpy.props.FloatProperty(update = updateDefault)

I’m not even sure if that is all that safe, but it does work.

When foo is actually written to (i.e. context.scene.foo = 42 is run somewhere in the code), it will be “set in stone”, being saved and loaded to/from the file for all eternity instead of returning the default value when read. Now, I want to be able to return foo to its pristine condition in some manner, so that reads from it return the value of theDefault again. However, I can’t find the right way to do it.

class UnsetFoo(bpy.types.Operator):
    bl_idname = "view3d.unset_foo"
    bl_label = "Unset Foo"
    def execute(self, context: bpy.types.Context):
        prefs: MyAddonPrefs = context.preferences.addons["my_addon"].preferences
        context.scene.foo = prefs.theDefault # FIXME: this only does half the job
        return {"FINISHED"}

How can I return the value of a property to behave as if it had never been written after its registration?

I guess I could make a second property to tell if the custom value should apply or not, if no one has an idea.