melobot.di¶
依赖注入部件¶
- class melobot.di.Depends[源代码]¶
基类:
object
- __init__(dep: Callable[[], Any] | AsyncCallable[(), Any] | Depends, sub_getter: Callable[[Any], Any] | AsyncCallable[typing_extensions.Any, Any] | None = None, cache: bool = False, recursive: bool = True) None [源代码]¶
初始化一个依赖项
- 参数:
dep (Callable[[], Any] | AsyncCallable[(), Any] | Depends) -- 依赖来源(可调用对象,异步可调用对象,或依赖项)
sub_getter (Callable[[Any], Any] | AsyncCallable[(typing_extensions.Any,), Any] | None) -- 子获取器(可调用对象,异步可调用对象或空),在获得依赖之后,于其上继续获取
cache (bool) -- 是否启用缓存
recursive (bool) -- 是否启用递归满足(默认启用,如果当前依赖来源中存在依赖项,会被递归满足;关闭可节约性能)
- 返回类型:
None
- class melobot.di.DependsHook[源代码]¶
基类:
Depends
,BetterABC
,Generic
[T
]依赖钩子
包装一个依赖项,依赖满足后内部的 hook 将会执行
- __init__(func: Callable[[P], T] | AsyncCallable[P, T], cache: bool = False, recursive: bool = False) None [源代码]¶
初始化一个依赖项
- 参数:
dep -- 依赖来源(可调用对象,异步可调用对象,或依赖项)
sub_getter -- 子获取器(可调用对象,异步可调用对象或空),在获得依赖之后,于其上继续获取
cache (bool) -- 是否启用缓存
recursive (bool) -- 是否启用递归满足(默认启用,如果当前依赖来源中存在依赖项,会被递归满足;关闭可节约性能)
func (Callable[[~P], T] | AsyncCallable[~P, T])
- 返回类型:
None
- melobot.di.inject_deps(injectee: Callable[[...], T] | AsyncCallable[..., T], manual_arg: bool = False) AsyncCallable[..., T] [源代码]¶
依赖注入标记装饰器,标记当前对象需要被依赖注入
可以标记的对象类别有: 同步函数,异步函数,匿名函数,同步生成器函数,异步生成器函数,实例方法、类方法、静态方法
- 参数:
injectee (Callable[[...], T] | AsyncCallable[..., T]) -- 需要被注入的对象
manual_arg (bool) -- 当前对象标记需要依赖注入后,是否还可以给某些参数手动传参
- 返回:
异步可调用对象,但保留原始参数和返回值签名
- 返回类型:
AsyncCallable[..., T]
依赖注入元数据标记¶
依赖注入时用作 Annotated
元数据
- class melobot.di.Exclude[源代码]¶
基类:
object
数据类。types 指定的类别会在依赖注入时被排除
# 假设有继承关系 A <- B, A <- C, A <- D # 表示 A 中不包括 B 和 C 类别的所有子类型,当然,还是会兼容 A 类型本身 NewTypeHint = Annotated[A, Exclude(types=[B, C])]
- class melobot.di.CustomLogger[源代码]¶
基类:
object
数据类。getter 参数会用于指定类别日志器不存在时的获取方法
# 如果 bot 设置的 logger 是 MyLogger 类型,则成功依赖注入 # 否则使用 getter 获取一个日志器 NewLoggerHint = Annotated[MyLogger, CustomLogger(getter=lambda: MyLogger())]
- class melobot.di.Reflect[源代码]¶
基类:
object
数据类。指定不直接获取当前依赖项,而是获取对应的一个反射代理
这适用于希望依赖会随着上下文改变,而动态变化的情况。例如动态引用会话流程中的事件对象
# 注入一个依赖时进一步包装为反射依赖 event_proxy = Annotated[Event, Reflect()] # 就像使用 event 一样使用 event_proxy event_proxy.attr_xxx event_proxy.method_xxx() # 不过 event_proxy 不是完美的代理 # 因此 isinstance 类似的操作,使用 __origin__ 获取原始对象 isinstance(event_proxy.__origin__, SomeEventType) # 或者是作为运行逻辑未知的函数的参数 dont_know_what_this_do(event_proxy.__origin__)