V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
louisyoungx
V2EX  ›  Python

响应式的 Python 状态存储库

  •  
  •   louisyoungx ·
    louisyoungx · 2022-02-23 17:52:58 +08:00 · 2705 次点击
    这是一个创建于 791 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天在学 Vue.js 的源码,发现数据的响应式很有意思,对数据进行修改能触发自定义的操作。所以我在想能否用这样的特性在 Python 上做个有意思的小工具。

    然后我写了 Stora ,一个帮你保存字典数据到本地的 Python 库

    GitHub - Stora: A simple, reactive local storage library

    通过 Stora 保存数据非常简单,不需要手动操作文件 api 。你只需要更改字典中的数据,Stora 就会自动帮你保存到本地的文件。

    保存的文件名默认为 state.json,文件的存储路径默认为当前执行路径

    安装

    pip install stora
    

    通过例子快速入门

    from stora import stora
    apple = {"name": "Apple", "price": "10", "size": "small"}
    s = stora(apple)
    print(s.state) # {"name": "Apple", "price": "10", "size": "small"}
    

    PS:  你也可以自己决定文件名和路径,比如:
    s = stora(apple, filename='apple.json', filepath='~/.data/')

    现在你会发现执行目录中有一个 state.json, 你会看到文件中内容已经被修改了。

    {
        "name": "Apple",
        "price": "10",
        "size": "small"
    }
    

    下一次你在同一个路径下初始化一个 stora 对象,stora 将会搜索默认路径下有没有一个叫 state.json 的文件,如果有的话会尝试读取里面的数据并返回一个响应式的字典。

    from stora import stora
    s = stora()
    print(s.state) # {"name": "Apple", "price": "10", "size": "small"}
    

    取值和赋值操作是和字典一样的

    # Fetching
    print(s.state['name']) # Apple
    print(s.state['price']) # 10
    # Assignment
    s.state['name'] = 'Banana'
    s.state['price'] = 20
    

    这时打开 state.json 会发现内容改变了

    {
        "name": "Banana",
        "price": "20",
        "size": "small"
    }
    

    但是这里有个容易引起困惑的机制,如果已经有存储了数据的 state.json ,而你在初始化的时候再次对他赋值,返回的 stora 状态会是 state.json 中读取的数据,而非初始化的数据。

    from stora import stora
    apple = {"name": "Apple", "price": "10", "size": "small"}
    s = stora(apple)
    print(s.state) # {"name": "Banana", "price": "20", "size": "small"}
    

    这是为了防止数据丢失,所以已经存储在现有文件中的数据会有更高的优先级。

    但你也可以通过强制重写来初始化 stora ,或者给 stora 一个不一样的文件名或路径

    s1 = stora(apple, force=True) # 强制重写
    s2 = stora(apple, filename='apple-10.json') # 定义不一样的文件名或路径
    
    7 条回复    2022-02-24 16:41:45 +08:00
    InvincibleDream
        1
    InvincibleDream  
       2022-02-23 18:16:15 +08:00
    要不要考虑用 python 自带的 sqlite3 创建结构化存储?
    Trim21
        2
    Trim21  
       2022-02-23 18:23:58 +08:00 via Android
    响应式的在标准库里有 shelve…
    lisongeee
        3
    lisongeee  
       2022-02-23 19:49:09 +08:00
    看了你的源代码,每个赋值操作都会触发文件更新,如果在循环里赋值,就很得不偿失。vue 这种 数据驱动 模式在 协程化 的 python ui 程序里 可能比较有用
    ClericPy
        4
    ClericPy  
       2022-02-23 20:52:01 +08:00
    @InvincibleDream 你说的不会是 sqlitedict 吧... 快六七年没用它了, 上个月又用了一会还是那么快那么香

    就像楼上提到的 shelve, 爱动手是成功的开始, 参考现有成熟经验是成功的捷径, 期待楼主再接再厉带点新鲜花活, 现在 Python 区快成一潭死水了...
    InvincibleDream
        5
    InvincibleDream  
       2022-02-24 08:31:00 +08:00
    @ClericPy 我还没用过 sqlitedict ,简单看了下和我想说的比较像。

    我想问一下这种响应式的数据用在哪里比较好呢?
    fgwmlhdkkkw
        6
    fgwmlhdkkkw  
       2022-02-24 15:53:16 +08:00
    把“保存到本地文件”这种操作留一个接口,让用户可以自定义。那用处会大一点吧……
    如果用 python 来做 gui ,应该还是有用的。
    deplivesb
        7
    deplivesb  
       2022-02-24 16:41:45 +08:00
    你这个和 shelve 相比有啥优势么???
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5443 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:52 · PVG 13:52 · LAX 22:52 · JFK 01:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.