pylectra.registry 模块¶
参考资料
前置阅读: 什么是插件
插件注册表 + 装饰器。
12 个白名单类别¶
CATEGORIES = (
"generator", "exciter", "governor", "pss",
"ode_solver", "power_flow",
"fault", "case", "scenario", "filter",
"small_signal", "plot",
)
类别白名单,不能随意添加新类别——避免插件爆炸。
@register(category, name)¶
类装饰器:把类塞进注册表 category/name。
from pylectra.registry import register
from pylectra.interfaces.fault import FaultEvent
@register("fault", "my_fault")
class MyFault(FaultEvent):
def build_arrays(self):
...
抛错
ValueError—category不在白名单ValueError—name已注册(除非是同一类的重复 import)
注册同时给类加两个属性:
cls.__plugin_category__ = categorycls.__plugin_name__ = name
get(category, name)¶
不存在抛 KeyError,错误信息列出当前 category 下所有已注册名。
list_plugins(category=None)¶
from pylectra.registry import list_plugins
list_plugins("fault")
# {'fault': ['bus_fault', 'composite', 'line_trip', 'load_step']}
list_plugins() # 全部
# {'case': [...], 'exciter': [...], ...}
categories()¶
from pylectra.registry import categories
print(categories())
# ['case', 'exciter', 'fault', 'filter', 'generator',
# 'governor', 'ode_solver', 'plot', 'power_flow',
# 'pss', 'scenario', 'small_signal']
只返回当前已有插件的类别(白名单中可能某些类别空着)。
reset()¶
仅供测试用。生产代码里调用会让 import pylectra 后续行为崩坏。
自动发现机制¶
import pylectra 触发:
- 内置发现 —
pylectra.plugin_loader.discover()用pkgutil.walk_packages递归 importpylectra所有子模块(除_legacy) - 第三方发现 — 读
importlib.metadata.entry_points(group="pylectra.plugins")并依次 import
第三方包发布插件示例:
# 你的 pyproject.toml
[project.entry-points."pylectra.plugins"]
my_extension = "my_pkg.plugins" # 这个模块里的 @register 会被触发
注册表内部结构¶
from pylectra.registry import _REGISTRY
# {category: {name: class}}
_REGISTRY["fault"]["bus_fault"]
# <class 'pylectra.faults.bus_fault.BusFault'>
⚠️
_REGISTRY是私有 dict,别直接改——绕过了重名检查、注册表会失去一致性。
接下来读什么¶
- pylectra.interfaces — 各类别 ABC
- 插件清单 — 内置全部