附加状态

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如何在wicket中创建元素<a>   java如何将字节/整数转换为十六进制以雕刻文件   javajavafx:为什么不管我传递给'textArea'的是什么类型的'changeListener'都无法编译。getKeyPressedProperty()。addListener`   java自定义Listview性能不佳,Listview项名称从数据库转换   单元测试java。lang.AssertionError:响应内容   java如何使用highchart缩放条形图?   RouterFunction中的java Why谓词字段。DefaultRouterFunction<T extends ServerResponse>类获取DefaultErrorWebExceptionHandler?   java我可以用Map<String,Integer>覆盖Map<Integer,Integer>吗?   java Log4j文件已创建但为空   java无法解析JavaCV中的导入   Sun PKCS11实现的java 64位替代方案   java Hibernate与JDO makeTransient的等价物是什么   java从嵌套的switch语句退出到外部switch语句   java Android保留一个位图作为更改色调、对比度、饱和度等的源   java Mule ESB 3.5创建ws-client时出错   java数组循环将自身乘以1024   java数据库自动更新失败   java递归ConcurrentHashMap。ComputeFabSent()调用永远不会终止。Bug还是“功能”?   java是否为调用方方法中正在处理的异常执行hibernate回滚事务?