# 认识 Annotations 特性

# 什么是 Annotations?

即 Python 3.5 及以上版本的特性 类型注解(Annotations). 于 PEP3107 中被提出, 并于 PEP526 中强化, 使之可以覆盖到变量层面.

主要的实现 typing 是 Python 的标准库.

# 在 python-mirai 中的应用

我们使用 Annotations 特性来给事件运行主体分发上下文项, 并基于其提供了附加功能.

TIP

Application 机制也支持使用 Annotations 特性, 且具体的变动将在接下来讲解.

# 基本案例

from mirai import (
    Mirai, Group, Member, Friend,
    GroupMessage, FriendMessage
)
app = Mirai(......)
...
@app.receiver(GroupMessage)
async def GMHandler(app: Mirai, group: Group, member: Member, message: GroupMessage):
    pass

@app.receiver(FriendMessage)
async def FMHandler(app: Mirai, friend: Friend, message: FriendMessage):
    pass
...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

当你做好类型推断后, 只需要按照规则调用就好.

可以作为注解项的类型(值), 以下都可以在模块 mirai 处直接引入:

是否常用 注解项的值 说明 指向的实例 条件限制
√ Mirai 即 Mirai 实例本身 正在运行的 Mirai 实例 无
√ Source 在信息链里面的 Source(消息源) 组件 用于取出消息的 MessageID 和发送时间 不能在事件的监听里用.
√ MessageChain 捕获到的消息链 用于获取接收到的消息 不能在事件的监听里用.
√ Group 群消息的群 用于获取群消息的来源 只能在监听 GroupMessage 的事件内使用.
√ Member 发群消息的群成员 用于获取群消息的发送者 只能在监听了 GroupMessage 的事件内使用.
√ Friend 发好友消息的好友 用于获取好友消息的发送者 只能在监听了 FriendMessage 的事件内使用.
√ 各个事件的类 事件的实例 事件的实例, 在 mirai.event.external 内被定义 只能在对应事件的监听内使用.
× GroupMessage 属于低级API, 可以使用其他的代替 当前消息的序列化对象 只能在监听 GroupMessage 的事件内使用.
× FriendMessage 属于低级API, 可以使用其他的代替 当前消息的序列化对象 只能在监听 FriendMessage 的事件内使用.
? "Sender" 消息的发送者, 值可能是 Member 也可能是 Friend 当前消息的序列化对象内属性 sender 的值 只能在实例内有属性 sender 的事件内使用.
? "Type" 当前捕获到的事件名称 必定是字符串 魔法注解, 无条件限制