72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
class Nucleon:
|
|
"""原子核: 材料元数据"""
|
|
|
|
def __init__(self, ident: str, payload: dict, metadata: dict = {}):
|
|
"""初始化原子核 (记忆内容)
|
|
|
|
Args:
|
|
ident: 唯一标识符
|
|
payload: 记忆内容信息
|
|
metadata: 可选元数据信息
|
|
"""
|
|
self.metadata = metadata
|
|
self.payload = payload
|
|
self.ident = ident
|
|
|
|
def __getitem__(self, key):
|
|
if key == "ident":
|
|
return self.ident
|
|
if key in self.payload:
|
|
return self.payload[key]
|
|
else:
|
|
raise KeyError(f"Key '{key}' not found in payload.")
|
|
|
|
def __iter__(self):
|
|
yield from self.payload.keys()
|
|
|
|
def __len__(self):
|
|
return len(self.payload)
|
|
|
|
def __hash__(self):
|
|
return hash(self.ident)
|
|
|
|
def do_eval(self):
|
|
"""
|
|
执行并以结果替换当前单元的所有 eval 语句
|
|
TODO: 带有限制的 eval, 异步/多线程执行避免堵塞
|
|
"""
|
|
|
|
# eval 环境设置
|
|
def eval_with_env(s: str):
|
|
try:
|
|
nucleon = self
|
|
ret = str(eval(s))
|
|
except Exception as e:
|
|
ret = f"此 eval 实例发生错误: {e}"
|
|
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:
|
|
if isinstance(data, str):
|
|
if data.startswith("eval:"):
|
|
return modifier(data[5:])
|
|
return data
|
|
|
|
traverse(self.payload, eval_with_env)
|
|
traverse(self.metadata, eval_with_env)
|
|
|
|
@staticmethod
|
|
def placeholder():
|
|
"""生成一个占位原子核"""
|
|
return Nucleon("核子对象样例内容", {})
|