跳转至

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 方法获取所有被声明的字段.