Archived
0
0

实现 Recognition 部件

This commit is contained in:
2025-11-08 13:23:15 +08:00
parent 92f9903307
commit 330846a4a5
8 changed files with 108 additions and 54 deletions

View File

@@ -7,6 +7,7 @@ import typing
import toml
import json
import bidict
from heurams.context import config_var
class AtomRegister(TypedDict):
nucleon: Nucleon
@@ -32,7 +33,8 @@ class Atom():
def __init__(self, ident = ""):
self.ident = ident
atom_registry[ident] = self
self.register: AtomRegister = { # type: ignore
# self.is_evaled = False
self.registry: AtomRegister = { # type: ignore
"nucleon": None,
"nucleon_path": None,
"nucleon_fmt": "toml",
@@ -43,37 +45,73 @@ class Atom():
"orbital_path": None, # 允许设置为 None, 此时使用 nucleon 文件内的推荐配置
"orbital_fmt": "toml",
}
self.do_eval()
def link(self, key, value):
if key in self.register.keys():
self.register[key] = value
if key in self.registry.keys():
self.registry[key] = value
self.do_eval()
else:
raise ValueError("不受支持的原子元数据链接操作")
def do_eval(self):
"""
执行并以结果替换当前单元的所有 eval 语句
TODO: 带有限制的 eval, 异步/多线程执行避免堵塞
"""
# eval 环境设置
def eval_with_env(s: str):
nucleon = self.registry['nucleon']
default = config_var.get()["puzzles"]
metadata = nucleon.metadata
try:
ret = str(eval(s))
except:
ret = "此 eval 实例发生错误"
return ret
def traverse(data, modifier):
if isinstance(data, dict):
for key, value in data.items():
data[key] = traverse(value, modifier)
return data
elif isinstance(data, list):
for i, item in enumerate(data):
data[i] = traverse(item, modifier)
return data
elif isinstance(data, tuple):
return tuple(traverse(item, modifier) for item in data)
else:
return modifier(data)
traverse(self.registry["nucleon"], eval_with_env)
traverse(self.registry["orbital"], eval_with_env)
def persist(self, key):
path: pathlib.Path | None = self.register[key + "_path"]
path: pathlib.Path | None = self.registry[key + "_path"]
if isinstance(path, pathlib.Path):
path = typing.cast(pathlib.Path, path)
path.parent.mkdir(parents=True, exist_ok=True)
if self.register[key + "_fmt"] == "toml":
if self.registry[key + "_fmt"] == "toml":
with open(path, "w") as f:
toml.dump(self.register[key], f)
elif self.register[key + "_fmt"] == "json":
toml.dump(self.registry[key], f)
elif self.registry[key + "_fmt"] == "json":
with open(path, "w") as f:
json.dump(self.register[key], f)
json.dump(self.registry[key], f)
else:
raise KeyError("不受支持的持久化格式")
else:
raise TypeError("对未初始化的路径对象操作")
def __getitem__(self, key):
if key in self.register:
return self.register[key]
if key in self.registry:
return self.registry[key]
raise KeyError(f"不支持的键: {key}")
def __setitem__(self, key, value):
if key in self.register:
self.register[key] = value
if key in self.registry:
self.registry[key] = value
else:
raise KeyError(f"不支持的键: {key}")