响应式的 Python 状态存储库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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

响应式的 Python 状态存储库

  •  
  •   louisyoungx
    louisyoungx Feb 23, 2022 3618 views
    This topic created in 1523 days ago, the information mentioned may be changed or developed.

    前几天在学 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 replies    2022-02-24 16:41:45 +08:00
    InvincibleDream
        1
    InvincibleDream  
       Feb 23, 2022
    要不要考虑用 python 自带的 sqlite3 创建结构化存储?
    Trim21
        2
    Trim21  
       Feb 23, 2022 via Android
    响应式的在标准库里有 shelve…
    lisongeee
        3
    lisongeee  
       Feb 23, 2022
    看了你的源代码,每个赋值操作都会触发文件更新,如果在循环里赋值,就很得不偿失。vue 这种 数据驱动 模式在 协程化 的 python ui 程序里 可能比较有用
    ClericPy
        4
    ClericPy  
       Feb 23, 2022
    @InvincibleDream 你说的不会是 sqlitedict 吧... 快六七年没用它了, 上个月又用了一会还是那么快那么香

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

    我想问一下这种响应式的数据用在哪里比较好呢?
    fgwmlhdkkkw
        6
    fgwmlhdkkkw  
       Feb 24, 2022
    把“保存到本地文件”这种操作留一个接口,让用户可以自定义。那用处会大一点吧……
    如果用 python 来做 gui ,应该还是有用的。
    deplivesb
        7
    deplivesb  
       Feb 24, 2022
    你这个和 shelve 相比有啥优势么???
    About     Help     Advertise     Blog     API     FAQ     Solana     5592 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 60ms UTC 01:34 PVG 09:34 LAX 18:34 JFK 21:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86