Giter Club home page Giter Club logo

Comments (4)

falkoschindler avatar falkoschindler commented on May 24, 2024

Very interesting, @natankeddem!

Here is an example with just a PersistentDict:

import copy
from pathlib import Path
from nicegui import observables, storage, ui

@ui.page('/')
def index():
    d = storage.PersistentDict(Path('tmp.json'))
    d['a'] = {'b': 0}
    copy.deepcopy(d['a'])
    ui.timer(0.1, lambda: print(Path('tmp.json').read_text()), once=True)

I think the deepcopy function copies some internals of the underlying ObservableDict, so that the change handler is triggered during the copy operation, which writes an empty dictionary to the JSON file.

Here is another example demonstrating how on_change is called with an empty "a" attribute:

from nicegui import observables

d = observables.ObservableDict({'a': {'b': 0}}, on_change=lambda sender: print('changed:', sender))
print('copying...')
copy.deepcopy(d['a'])
copying...
changed: ObservableChangeEventArguments(sender={'a': {}})
changed: ObservableChangeEventArguments(sender={'b': 0})

from nicegui.

natankeddem avatar natankeddem commented on May 24, 2024

It took me a bit to figure out what kept on deleting my storage. Then once I saw it was the deepcopy I guessed something similar to what you suggested but didn't dig too deep since I was trying to get some other things working on my project. To accomplish the deepcopy I ended up using the json.loads(json.dumps(app.storage.general["key"])) trick.

from nicegui.

falkoschindler avatar falkoschindler commented on May 24, 2024

It looks like we need to overwrite the __copy__ and __deepcopy__ methods of our observable collections:
https://docs.python.org/3/library/copy.html

from nicegui.

natankeddem avatar natankeddem commented on May 24, 2024

Thank you!

from nicegui.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.