如何优化三个返回逻辑相似的Python业务方法?
代码优化方案
1. 提取通用过滤逻辑
三个过滤方法的核心流程高度重复:生成水果正则组 → 调用对应正则生成函数 → 从固定文本源匹配结果。可以把这部分重复逻辑抽成一个私有公共方法,仅通过传入不同的正则生成函数来区分不同的过滤目标:
def _filter_verdi_data(self, regex_builder): # 复用水果组生成逻辑(若三个方法都依赖此逻辑) fruits_groups = (f"(?:{fruit})" for fruit in self.extractingText.list_fruit) fruits_combined = f'(?:{"|".join(fruits_groups)})' # 统一获取文本源,避免重复书写路径 target_text = self.extractingText.text_factuur_verdi[0] # 生成对应正则并匹配 pattern = regex_builder(fruits_combined) return re.findall(pattern, target_text)
之后原有的三个过滤方法可以简化为极简的委托调用:
def filter_verdi_total_fruit_cost(self): return self._filter_verdi_data(self.regex_fruit_cost) def filter_verdi_total_number_fruit(self): return self._filter_verdi_data(self.regex_total_number_fruit) def filter_verdi_fruit_name(self): return self._filter_verdi_data(self.regex_fruit_name)
2. 可选:整合方法内统一文本源(极致优化)
如果担心多次访问text_factuur_verdi[0]的开销(虽然属性访问成本极低,但统一管理更清晰),可以在整合方法中先获取一次文本源,再传给公共过滤方法:
def _filter_verdi_data(self, regex_builder, target_text): fruits_groups = (f"(?:{fruit})" for fruit in self.extractingText.list_fruit) fruits_combined = f'(?:{"|".join(fruits_groups)})' pattern = regex_builder(fruits_combined) return re.findall(pattern, target_text) def show_extracted_data_from_file(self, file_name): self.extractingText.extract_text_from_image(file_name) target_text = self.extractingText.text_factuur_verdi[0] total_fruit = self._filter_verdi_data(self.regex_total_number_fruit, target_text) fruit_name = self._filter_verdi_data(self.regex_fruit_name, target_text) fruit_total_cost = self._filter_verdi_data(self.regex_fruit_cost, target_text) return "\n".join(f"{a}\t{b}\t{c}" for a, b, c in zip(total_fruit, fruit_name, fruit_total_cost))
优化核心收益
- 减少维护成本:后续修改正则生成逻辑、文本源路径,只需要改动公共方法一处即可,避免在三个地方重复修改。
- 提升代码可读性:简化后的过滤方法仅保留核心意图(指定用哪个正则生成器),逻辑一目了然。
- 扩展性更强:如果后续新增同类过滤需求,只需要新增一个正则生成函数和一行委托代码即可。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

