创建一个前置插件
前置插件是什么?
当你编写了一个插件,想在其他插件调用该插件的功能 API 时,你需要创建一个前置插件。
python
from tooldelta import plugin_entry, Plugin
class MyPlugin(Plugin):
name = "示例 api 插件"
def greet(self, msg: str):
print("hello,", msg)
# 注册插件
# 这里多了两个参数,告诉 ToolDelta 这是一个 API 插件:
# 1. API 名; 2. API 版本
entry = plugin_entry(MyPlugin, "example-api", (0, 0, 1))
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
现在,你把你的插件类 MyPlugin
既注册为了一个插件,又同时注册为了插件 API;
它既可以作为一个普通插件运行, 又可以被其他插件获取调用。
现在我们可以跨插件调用这个插件里的所有方法。
其他插件使用你的 API 插件提供的功能:
python
from tooldelta import Plugin
class MyPlugin2(Plugin):
name = "另一个插件"
def __init__(self, frame):
super().__init__(frame)
self.ListenPreload(self.on_preload)
def on_preload(self):
api = self.GetPluginAPI("example-api")
api.greet("world")
# 终端输出:hello, world
entry = plugin_entry(MyPlugin2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
原理
实际上 GetPluginAPI() 返回的是一个 Plugin
对象的实例
也就是说, 你能通过其来获取其他类式插件的类的对象
如 GetPluginAPI("example-api")
获取到的其实就是上面所说的 MyPlugin
对象
看起来示例中的 greet()
在 IDE 中没有得到语法高亮,因为编辑器不知道它返回的对象的类型。
如果你想解决这个问题, ToolDelta 也提供了如下方法让导入的插件接口能被 IDE 高亮:
python
from tooldelta import plugins, TYPE_CHECKING
class MyPlugin2(Plugin):
name = "另一个插件"
def __init__(self, frame):
super().__init__(frame)
self.ListenPreload(self.on_preload)
def on_def(self):
self.api_from_another_plugin = self.GetPluginAPI(
"example-api-plugin",
(0, 0, 1)
)
if TYPE_CHECKING:
# 假设刚刚编写的 MyPlugin 类在 插件文件/ToolDelta类式插件/MY_PLUGIN/__init__.py 文件中
from MY_PLUGIN import MyPlugin
self.api_from_another_plugin = self.get_typecheck_plugin_api(MyPlugin)
def use_api_somewhere(self):
# 将鼠标移动到 api_from_another_plugin 上,IDE 会提示其为一个 `MyPlugin` 对象
# 将鼠标移动到 greet() 方法上,IDE 会提示和高亮该方法
self.api_from_another_plugin.greet("world")
# get_typecheck_plugin_api 的原理是在类型注释中使用 (type[PT]) -> PT 实现类型检测
# 所以 **不能** 在运行代码中使用这个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
有关插件市场中的一些官方前置插件可 点此 查看。