如何复用Python中仅端点不同的重复函数代码以消除冗余?
解决代码重复:复用HTTP请求逻辑的几种方案
你现在的代码确实存在大量重复,四个函数除了endpoint名称几乎完全一致,不仅维护麻烦(比如改错误处理要改四次),还容易出现像remove_jitter里错误信息写错的低级bug。下面给你两种实用的重构方案,彻底消除冗余:
方案一:提取核心通用函数(最直观易维护)
把所有重复的HTTP请求、错误处理、日志打印逻辑抽成一个私有通用函数,然后让四个业务函数去调用它。这样后续修改逻辑只需要改这一个地方:
import requests def _call_network_endpoint(mbxIP, endpoint_name, param_name, param_value): # 构造请求URL url = f"http://{mbxIP}:5000/{endpoint_name}?{param_name}={param_value}" try: response = requests.get(url) # 自动触发HTTP错误(比如4xx/5xx状态码) response.raise_for_status() print('OK') return True except requests.exceptions.RequestException as e: # 统一处理所有请求异常(连接失败、超时、HTTP错误等) print(f"ERROR in {endpoint_name}. URL: {url}. Error: {str(e)}") return False # 简洁的业务函数,只传递特定参数 def add_latency(mbxIP, latency): return _call_network_endpoint(mbxIP, "add_latency", "ms", latency) def remove_latency(mbxIP, latency): return _call_network_endpoint(mbxIP, "remove_latency", "ms", latency) def add_jitter(mbxIP, jitter): return _call_network_endpoint(mbxIP, "add_jitter", "ms", jitter) def remove_jitter(mbxIP, jitter): return _call_network_endpoint(mbxIP, "remove_jitter", "ms", jitter)
这个方案的优点:
- 单一职责:通用函数只负责和Flask服务通信,业务函数只负责传递特定参数
- 易维护:比如要把
GET改成POST、添加请求超时、修改日志格式,只需要修改_call_network_endpoint一次 - 避免复制粘贴错误:像原代码中
remove_jitter错误信息写错的问题会自动消失
方案二:使用functools.partial简化代码(更简洁)
因为你的四个接口都用ms作为参数名,可以进一步简化通用函数,然后用partial快速生成业务函数:
import requests from functools import partial def _call_network_endpoint(mbxIP, endpoint_name, param_value): url = f"http://{mbxIP}:5000/{endpoint_name}?ms={param_value}" try: response = requests.get(url) response.raise_for_status() print('OK') return True except requests.exceptions.RequestException as e: print(f"ERROR in {endpoint_name}. URL: {url}. Error: {str(e)}") return False # 用partial固定endpoint_name参数,生成对应的业务函数 add_latency = partial(_call_network_endpoint, endpoint_name="add_latency") remove_latency = partial(_call_network_endpoint, endpoint_name="remove_latency") add_jitter = partial(_call_network_endpoint, endpoint_name="add_jitter") remove_jitter = partial(_call_network_endpoint, endpoint_name="remove_jitter")
这个方案的优点:
- 代码更简洁,不需要手动定义每个业务函数
- 功能和方案一完全一致,同样具备易维护性
两种方案都能很好解决你的代码重复问题,推荐方案一(更直观,适合团队协作),如果追求极致简洁可以用方案二。
内容的提问来源于stack exchange,提问作者Asad Javed
相关产品推荐
相关产品推荐

