From a2c6a97621e6faac94716c43bc649f4cbccb2937 Mon Sep 17 00:00:00 2001 From: iomgaa Date: Sat, 11 Jul 2026 08:56:17 -0400 Subject: [PATCH] refactor(tree): extract _clean_join to keep entity-fields complexity at B MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 质量门要求新增代码复杂度不超过 B 级:将 node_entity_fields 中重复的 "清洗-去重-拼接"逻辑抽为模块级纯函数 _clean_join,主体收敛为两次 调用。radon:node_entity_fields C(13) → B(6),_clean_join A(5)。 算法 #11(树环境语义搜索)数据访问层,行为不变(既有 4 测试未改全绿)。 --- app/tree/environment.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/app/tree/environment.py b/app/tree/environment.py index df0532e..b89df7b 100644 --- a/app/tree/environment.py +++ b/app/tree/environment.py @@ -94,6 +94,19 @@ _ENTITY_FIELDS_BY_LEVEL: dict[str, tuple[str, ...]] = { } +def _clean_join(values: object) -> str: + """过滤非空字符串、去重(保序)、分号拼接;无有效值返回空串。 + + 参数: + values: 待清洗的值集合(通常为 list[str],容忍 None / 混入非字符串)。 + + 返回: + "a; b; c" 形式的拼接串,无有效值时为空串。 + """ + cleaned = [v.strip() for v in (values or []) if isinstance(v, str) and v.strip()] + return "; ".join(dict.fromkeys(cleaned)) + + def _collect_from_obj( obj: object, out: list[str], @@ -240,23 +253,18 @@ class TreeEnvironment: if node is None: raise KeyError(f"节点不存在: {node_id}") level = _node_level(node) - out: dict[str, str] = {} entity_values: list[str] = [] for field_name in _ENTITY_FIELDS_BY_LEVEL[level]: - for value in getattr(node.card, field_name) or []: - if isinstance(value, str) and value.strip(): - entity_values.append(value.strip()) - if entity_values: - out["实体"] = "; ".join(dict.fromkeys(entity_values)) + entity_values.extend(getattr(node.card, field_name) or []) - text_values = [ - v.strip() - for v in (getattr(node.card, "visible_text", None) or []) - if isinstance(v, str) and v.strip() - ] - if text_values: - out["画面文字"] = "; ".join(dict.fromkeys(text_values)) + out: dict[str, str] = {} + entities_text = _clean_join(entity_values) + if entities_text: + out["实体"] = entities_text + visible_text = _clean_join(getattr(node.card, "visible_text", None)) + if visible_text: + out["画面文字"] = visible_text return out def search_similar(