Predicate DSL API 参考
约 474 字大约 2 分钟
2026-03-19
完整的 Predicate DSL 类型签名与工厂函数参考。用户指南见 Predicate DSL 入门。
P — 基类
class P(ABC):
@abstractmethod
def __call__(self, event: Event) -> bool: ...
def __and__(self, other: P) -> AndP: ...
def __or__(self, other: P) -> OrP: ...
def __invert__(self) -> NotP: ...
@classmethod
def of(cls, fn: Callable[[Event], bool]) -> P: ...所有 Predicate 继承自 P,支持 &(与)、|(或)、~(非)运算符。还支持 *(AND)、+(OR)作为别名运算符。
P.of()
将任意 Callable[[Event], bool] 包装为 P 实例:
from ncatbot.core import P
p = P.of(lambda e: str(e.data.user_id) == "12345")组合类型
| 类型 | 运算符 | 作用 |
|---|---|---|
AndP(a, b) | a & b | 两者都为 True |
OrP(a, b) | a | b | 任一为 True |
NotP(p) | ~p | 取反 |
工厂函数
所有工厂函数从 ncatbot.core 导出。
事件特征匹配
| 函数 | 签名 | 说明 |
|---|---|---|
same_user | (user_id: Union[str, int]) -> P | 匹配相同 user_id |
same_group | (group_id: Union[str, int]) -> P | 匹配相同 group_id |
is_private | () -> P | 匹配私聊事件 |
is_group | () -> P | 匹配群聊事件 |
is_message | () -> P | 匹配类型为 message 的事件 |
event_type | (prefix: str) -> P | 匹配指定 event.type(含前缀匹配) |
消息内容匹配
| 函数 | 签名 | 说明 |
|---|---|---|
has_keyword | (*keywords: str) -> P | 消息包含任一关键词 |
msg_equals | (text: str) -> P | 消息纯文本完全等于 |
msg_in | (*texts: str) -> P | 消息纯文本在指定集合内 |
msg_matches | (pattern: str) -> P | 消息纯文本匹配正则 |
事件派生
| 函数 | 签名 | 说明 |
|---|---|---|
from_event | (event) -> P | 自动推导同 session(同用户+同群/私聊) |
from_event 规则:
- 如果事件有
group_id→same_user(uid) & same_group(gid) & is_group() - 私聊消息 →
same_user(uid) & is_private() - 其他带
user_id→same_user(uid) & is_message()
同时支持高层事件对象(BaseEvent,有 .user_id)和底层 Event(有 .data.user_id)。
导入
from ncatbot.core import (
P, AndP, OrP, NotP,
same_user, same_group, is_private, is_group, is_message,
has_keyword, msg_equals, msg_in, msg_matches,
event_type, from_event,
)延伸阅读
- Predicate DSL 入门 — 用法示例与实战模式
- Dispatcher 内部机制 — 事件匹配与分发流程
版权所有
版权归属:MI
