附加状态

app-state的Python项目详细描述


极简反应式本地应用程序状态工具包。

此包提供了一种以以下形式存储应用程序状态的方法 单根递归键值树,表示订阅 对感兴趣的分支所做的更改。

简介

让我们考虑一个通用的应用程序,它有一个“屏幕”供用户 更改配置和另一个允许执行 一些有用的东西,取决于当前的配置。

如果我们将应用程序组织成单独的“配置屏幕” 模块和“主屏幕”模块,我们必须确保 当用户更改“配置”上的值时,屏幕会相应地做出反应 屏幕”。

从模块组合应用程序的传统方法 包括直接函数调用、“回调”模式, “signal:raw乳胶:插槽”图案和其他一些图案。方法 由本包提供的可被视为 “signal:raw乳胶:插槽”模式和“反应式编程”。

为了解决我们的应用程序案例,我们可以将配置屏幕模块写入 状态的任何设置:

fromapp_stateimportstate# This should likely happen in 'OK' button click callback, not displayed here.state.username='value'

我们让主屏幕模块通过 修饰函数wich将从state读取更改的值并更新 主屏幕显示:

fromapp_stateimportstate,on@on('state.username')defchange_user():title.text='Hello, '+state.username

安装

pip install app_state

用法

fromapp_stateimportstatestate["some_data"]=42# Alternatively: state.some_data = 42

state是一个类似字典的递归对象。为了贪婪,树枝 也可以使用.作为属性访问。

监听状态变化

@on(*patterns)decorator使修饰的函数或方法 每次状态子树更改时调用。每个pattern是 点分隔的字符串,表示状态子树路径。

fromapp_stateimportstate,on@on('state.countries')defcountries():print(f'countries changed to: {state.countries}')@on('state.countries.Australia.population')defau_population():population=state.get('countries',{}).get('Australia',{}).get('population')print(f'Australia population now: {population}')state.countries={'Australia':{'code':'AU'},'Brazil':{}}state.countries.Australia.population=4500000

将打印:

countries changed to: {'Australia': {'code': 'AU'}, 'Brazil': {}}
Australia population now: None
countries changed to: {'Australia': {'code': 'AU', 'population': 4500000}, 'Brazil': {}}
Australia population now: 4500000

@on()可以包装类的方法。当状态改变时,该方法 将为此类的每个实例调用。

fromapp_stateimportstate,onclassMainWindow:@on('state.user')defon_user(self):self.settext(f'Welcome, {state.user.name}')mainwindow=MainWindow()state.user={'name':'Alice'}# mainwindow.on_user() will be called.

持久性

默认情况下,状态存储在内存中。但是有可能 在文件更改时自动将状态存储到该文件。呼叫 state.autopersist('myfile')以启用持久性。这个函数 将从文件加载状态,并打开 声明此文件。

如果要从持久性中排除某些分支,则应该 将它们存储为属性,以下划线开头:

# `_temp_peers` will never be stored to a filestate.countries.Australia._temp_peers=[{'ip':'8.8.8.8'}]

API

state.autopersist(filepath,timeout=3,nursery=None)

启用自动状态持久性,使用给定的 文件路径。如果文件已经存在,请从中读取状态。

timeout-在写入文件之前要等待多少秒 每种状态都会改变。此参数有助于减少对 磁盘,将更改分组在一起。仅当状态更改发生在 具有asynciotrio事件循环的线程。

nursery-如果使用trio,则为必需。

classDictNode

app_state.state及其每个子树都是 DictNode。通常不需要显式使用该类。 DictNode的实例是一个类似dict的对象,当它 已更改,因此用on()decorator修饰的函数 适当地调用。当您创建字典并将其分配给任何 状态分支,它将隐式转换为DictNode

fromapp_stateimportstate,DictNodestate.countries={}assertisinstance(state.countries,DictNode)# True

as_dict(full=False)

此方法返回常规字典,转换DictNode和所有 子节点。

如果full为true,则以下划线开头的所有属性都将 也可以作为密钥包含在字典中。

state.config={'name':'user1'}state.config._session_start='16:35'print(state.config.as_dict(full=True))# prints {'name': 'user1', '_session_start': '16:35'}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在TextView中对齐部分文本   带有iText和eTPKCS11的java PKCS#11签名。dll&SunPKCS11提供程序   java Intellij Idea找不到jar   java Chrome/Firefox和Jetty HTTPS   java我无法打包找不到的JavaFX应用程序模块   多线程Java:排序从异步任务检索的结果   java客户端/服务器socket不能与外部连接一起工作   java如何在单击“下一步”按钮时获取其他详细信息?   java组织。springframework。网状物客户RestTemplate应声明为@Bean,而plain@Autowired抛出错误   java如何绘制javax。摆动将ImageIcon转换为JavaFX。fxml呈现用户界面?   使用for循环的Java跟踪   java如何编码字符串以显示彩色文本(基于字符串中的前缀)   Java保存/打开文件对象   基于java复选框的搜索:使用尽可能多的“”动态生成准备好的语句作为选中复选框的计数   java为什么crawler4j随机挂起?