重构重复Python代码:提取通用逻辑,自定义特定查询逻辑
重构方案:用回调函数封装可变逻辑
你可以把try/except块内的可变逻辑抽成回调函数,作为参数传入通用方法,这样就能把重复的25个方法合并成一个通用方法,只需要为每种不同逻辑写对应的回调函数即可。
1. 通用方法实现
def generic_lookup(findings, count, client, value, check_func): for finding in findings["Findings"]: for resource in finding["Resources"]: # 原有的固定遍历与发布逻辑 if finding["Status"] == "DEPLOYED": if count == 0: publish( finding["Title"], resource["Id"], finding["Status"], ) else: if count == 0: publish( finding["Title"], resource["Id"], finding["Status"], ) # 调用传入的回调处理可变查询逻辑 try: # 回调函数返回True时,触发原逻辑的return False if check_func(client, resource, value): return False except ClientError: pass return True
2. 定义不同的回调函数
针对每种查询逻辑,写一个轻量的回调函数封装细节:
示例1:直接用资源ID作为查询参数
def check_full_resource_id(client, resource, value): lookup_param = resource["Id"] lookup_result = client.LOOKUP_METHOD_A(TARGET_ID=lookup_param) return value in json.dumps(lookup_result["RESULT_KEY_A"])
示例2:拆分资源ID后作为查询参数
def check_split_resource_id(client, resource, value): lookup_param = resource["Id"].split(":")[3] lookup_result = client.LOOKUP_METHOD_B(TARGET_PART=lookup_param) return value in json.dumps(lookup_result["RESULT_KEY_B"])
3. 调用通用方法
原来的每个重复方法,现在只需调用通用方法并传入对应回调:
# 使用第一种查询逻辑 result_a = generic_lookup(findings, count, client, value, check_full_resource_id) # 使用第二种查询逻辑 result_b = generic_lookup(findings, count, client, value, check_split_resource_id)
方案优势
回调函数完整封装了「特定方法调用、参数处理、结果判断」的可变部分,通用方法只负责固定的遍历、发布和异常捕获逻辑,既消除了代码重复,又保留了每种查询逻辑的独立性。
内容的提问来源于stack exchange,提问作者flowermia
相关产品推荐
相关产品推荐

