仅调用strip类方法不同的Python重复代码如何优雅重构?
重构方案
核心思路是把不同mode对应的字符串处理方法做映射,彻底消除重复的分支逻辑,步骤如下:
- 先定义mode到字符串方法名的映射字典,统一绑定对应关系
- 提前标准化mode参数、完成参数合法性校验
- 用
getattr动态调用对应的处理方法,无需重复写多分支判断逻辑 - 统一处理字符串输入和可迭代输入的分支,消除重复代码
重构后代码
def clean_whitespaces(input, mode='all'): # mode和对应字符串处理方法的映射关系 strip_method_map = { 'all': 'strip', 'left': 'lstrip', 'right': 'rstrip' } # 标准化mode参数,兼容None的情况 mode = mode or 'all' # 参数合法性校验 if mode not in strip_method_map: valid_modes = list(strip_method_map.keys()) + [None] raise ValueError(f'clean_whitespaces: mode must be one of {valid_modes}.') # 获取对应处理方法名 method_name = strip_method_map[mode] # 统一处理逻辑 if isinstance(input, str): return getattr(input, method_name)() else: return [getattr(entry, method_name)() for entry in list(input)]
优化说明
- 代码量缩减近60%,所有逻辑仅实现一次,后续新增mode只需要在映射字典中添加对应关系即可,维护成本极低
- 消除了重复的分支判断逻辑,避免后续迭代修改时多分支改漏的问题
- 参数校验逻辑更清晰,合法mode列表不需要重复维护
- 功能和原代码完全兼容,输入输出行为没有任何变化
- 可选优化:如果担心参数名
input和Python内置函数input重名,可以把参数名改为input_data,不影响原有功能逻辑
内容的提问来源于stack exchange,提问作者Lecker Spam
相关产品推荐
相关产品推荐

