Statv🔗
Statv 是面向 Graia Project 各项目设计的 Status API 的实际实现, 包含了一个基于 asyncio 和描述器协议实现的状态实体类基类.
PyPI Project: statv
速览🔗
import asyncio
from statv import Statv, Stats
class ExampleStatus(Statv):
a = Stats[str]("stats_a")
b = Stats[int]("stats_b")
c = Stats[str]("stats_c", default="cc")
d = Stats[bool]("stats_d", default=False)
def __init__(self, a: str, b: int, c: str = "cc"):
super().__init__(init_stats = {
"stats_a": a,
"stats_b": b,
"stats_c": c
})
async def main():
stat = ExampleStatus("aaa", 111)
loop = asyncio.get_running_loop()
def n():
stat.a = "aa"
loop.call_later(5, n)
print(await stat.wait_for_update())
asyncio.run(main())
当实例上任何被声明的字段被更改, 所有 wait_for_update 都会被触发并推送最新版本的实例.
如果需要同时更改多个字段, 使用 update_many 方法. 注意, 传入的字典的键应该为相应的字段 ID, 即实例化 Stats 时传入的第一个字符串.
我们预置了名为 available 的 property, 默认返回 True, 你可以重写该 property.
你亦可以封装 wait_for_update, 直接在派生 Stats 时声明相应的方法, 并调用 self.wait_for_update 方法即可.
所有的内容都存于 _content 属性内, 该属性为一 dict[str, Any].
你可以使用 Statv[...].validator 审查对应字段上的更改:
@staticmethod
@stats.validator
def _(stats: Stats, past: ..., current: ...):
... # some validation
return current
可以使用 defined_stats 方法获取所有被声明的字段.