如何减少方法重复参数并解决调用时返回空列表问题
问题解决:消除参数重复传递+修复空列表返回问题
一、先修复空列表的核心bug
你在filter_verdi_total_fruit_cost里犯了一个关键错误:代码里遍历的是file_name.split('\n'),但file_name是文件名,不是从文件提取的文本内容!这就是为什么单独调用该方法时(大概率你误传了提取后的文本当参数)能得到结果,但在show_extracted_data_from_file里传真实文件名时返回空列表。
另外,这个方法里重复调用了extract_text_from_image(file_name)完全没必要——show_extracted_data_from_file已经调用过一次文本提取,重复调用既浪费资源,还可能导致状态混乱。
修改后的filter_verdi_total_fruit_cost代码:
def filter_verdi_total_fruit_cost(self): locale.setlocale(locale.LC_ALL, locale='Dutch') # 直接用extractingText已经提取好的文本,无需重复调用提取方法 return [ locale.atof(items[-1]) for items in ( token.split() for token in self.extractingText.extracted_text.split('\n') ) if len(items) > 2 and items[1] in self.extractingText.list_fruit ]
注:这里假设ExtractingTextFromFile类的extract_text_from_image方法会把提取到的文本存储到实例属性extracted_text中,如果你的类是其他命名方式,替换成对应存储提取结果的属性即可。
二、消除file_name参数的重复传递
核心思路是:在show_extracted_data_from_file中仅传入一次file_name并完成文本提取,后续所有内部方法直接使用实例中存储的提取结果,不再需要传递file_name参数。
修改后的完整代码示例
def show_extracted_data_from_file(self, file_name): # 仅调用一次文本提取,结果存入extractingText实例 self.extractingText.extract_text_from_image(file_name) total_fruit = self.filter_verdi_total_number_fruit() fruit_name = self.filter_verdi_fruit_name() # 不再传递file_name参数 fruit_total_cost = self.filter_verdi_total_fruit_cost() return "\n".join("{} \t {} \t {}".format(a, b, c) for a, b, c in zip(total_fruit, fruit_name, fruit_total_cost)) def filter_verdi_total_fruit_cost(self): locale.setlocale(locale.LC_ALL, locale='Dutch') extracted_text = self.extractingText.extracted_text return [ locale.atof(items[-1]) for items in ( token.split() for token in extracted_text.split('\n') ) if len(items) > 2 and items[1] in self.extractingText.list_fruit ]
额外优化建议
- 确认
ExtractingTextFromFile类的extract_text_from_image方法正确存储提取结果到实例属性,这是所有内部方法共享数据的基础。 - 把
locale.setlocale移到类的__init__方法中执行,避免每次调用filter_verdi_total_fruit_cost都重复执行。 - 检查
filter_verdi_total_number_fruit和filter_verdi_fruit_name方法,确保它们也是使用extractingText中已提取的文本,而非依赖外部传参。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

