You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:17:39