chronaxis.planning.lookups
源码基线:8904c2f744951857659abd40aaa3535d57faf53c
1"""在静态配置中解析 v4 一维表;仅创建冻结点对,不创建求值数组或打开文件。"""23from ..core.lookup import LookupTablePlan, MAX_POINTS, MAX_TABLES4from .checks import PlanValidationError, array_at, model_at, number_at, object_at, text_at567def parse_lookups(raw, version):8 """从根数组建立标定表。参数: 原列表及版本。返回: 冻结表元组。异常: 含具体位置的配置错误。"""9 items = array_at(raw, '$.lookups')10 if version != 4:11 raise PlanValidationError('$.lookups', 'lookups需要config_version=4')12 if len(items) > MAX_TABLES:13 raise PlanValidationError('$.lookups', f'最多声明{MAX_TABLES}张表')14 result, names = [], set()15 for index, item in enumerate(items):16 path = f'$.lookups[{index}]'17 item = object_at(item, path, ('name', 'points', 'input_unit', 'unit'))18 name = text_at(item['name'], path + '.name', identifier=True)19 if name in names:20 raise PlanValidationError(path + '.name', 'lookup表名重复')21 names.add(name)22 points = array_at(item['points'], path + '.points')23 if not 2 <= len(points) <= MAX_POINTS:24 raise PlanValidationError(path + '.points', f'查表需要2至{MAX_POINTS}个点')25 pairs = []26 for offset, pair in enumerate(points):27 position = f'{path}.points[{offset}]'28 if len(array_at(pair, position)) != 2:29 raise PlanValidationError(position, '查表点需要一对数值')30 pairs.append(tuple(number_at(v, f'{position}[{i}]') for i, v in enumerate(pair)))31 result.append(model_at(LookupTablePlan, path, name, tuple(pairs),32 text_at(item['input_unit'], path + '.input_unit'), text_at(item['unit'], path + '.unit')))33 return tuple(result)34