选择器对象 Selector
选择器 (Selector) 在 Avilla 中的地位举足轻重,各个功能都围绕这一组件发挥功用, 透过使用稳定的对象指示,Avilla 实现了易扩展的用户接口。
本质上,选择器其实就是一个 dict[str, str]
。
Selector().land("qq").group("941310484").member("1846913566")
# 相当于
{
"land": "qq",
"group": "941310484",
"member": "1846913566"
}
Note
自 Python 3.6 开始,字典 (dict) 就是有序的了。
对于大部分方法,我们都推荐在我们的 API Reference 查看,这里仅特别提及 follows
与 into
方法,也是我们推荐用于处理 Selector 的方法。
Selector.follows🔗
我们推荐使用 Selector.follows
方法判断一个选择器是否满足要求。
Note
过滤器 (Filter) 也采用了 follows-style
作为推荐使用的高层封装。
if cx.client.follows("::group.member(1234567890)"):
...
这段代码检查 cx.client
是否符合模式 "::group.member(1234567890)"
, 并返回布尔值供 if 控制。
Tip
"::" 是对 "land" 的缩写,以下代码片段中,这两种方法等效。
cx.scene.follows("::group.member(...)")
cx.scene.follows("land.group.member(...)")
不难发现,这一方式更符合直觉,并且写法也和构建 Selector 的一般方式相同。
你也可以使用 "*"
实现前缀匹配。
if cx.client.follows("::group.*"):
...
除此之外,你也可以使用自定义的函数来判断是否符合要求。注意,若存在后置括号,则使用该方法的优先级更高。
if cx.client.follows("::group.member", member=lambda mem: mem == "..."):
...
Tip
你还可以使用 Selector.from_follows_pattern
来构造选择器,但你需要同时给出所有节点的值。
Selector.from_follows_pattern("land(qq).group(941310484).member(1846913566)")
Selector.into🔗
如果需要对 Selector 获得其的一个变换,我们推荐使用 Selector.into
方法。
if cx.scene.follows("::group.*"):
cx.scene.into("::group.member(1111111)")
因为如果不符合条件就会报错,我们推荐与 Selector.follows
合用。
同样,也支持使用 kwargs 传参:
cx.scene.into(..., group="11111111111")