如何让Python代码遵循DRY原则?求避免重复代码的解决方案
如何让这段Python代码遵循DRY原则?
嘿,我来帮你搞定这个重复代码的问题~你的这段代码里,每个函数都重复了global is_on和if is_on:的判断逻辑,完全可以用DRY(Don't Repeat Yourself)原则来重构,下面给你几个实用的方案,适配Python 3.6.5版本:
方案1:使用装饰器(最简洁直接)
装饰器是Python里封装重复逻辑的绝佳工具,我们可以把「检查is_on状态,只有True时执行函数」这部分逻辑抽成一个装饰器,然后应用到每个函数上:
is_on = True def run_if_on(func): def wrapper(): global is_on if is_on: return func() return wrapper # 给每个函数加上装饰器 @run_if_on def func1(): # 这里写func1的核心业务逻辑,比如: print("func1 执行啦") @run_if_on def func2(): print("func2 执行啦") @run_if_on def func3(): print("func3 执行啦")
这样改造后,每个函数只需要专注于自己的核心逻辑,重复的判断和global声明都被统一放到了装饰器里,完美符合DRY原则。当外部修改is_on的值后,所有被装饰的函数都会自动遵循新的状态。
方案2:用类封装(避免全局变量)
如果你不想使用全局变量(全局变量在大型项目里容易引发问题),可以把状态is_on和相关函数封装到一个类里,用实例变量来管理状态:
class FunctionManager: def __init__(self): self.is_on = True # 用实例变量替代全局变量 # 内部装饰器,检查实例的is_on状态 def _run_if_on(self, func): def wrapper(): if self.is_on: return func() return wrapper @_run_if_on def func1(self): print("func1 执行啦") @_run_if_on def func2(self): print("func2 执行啦") @_run_if_on def func3(self): print("func3 执行啦") # 使用方式 manager = FunctionManager() manager.func1() # is_on为True,正常执行 manager.is_on = False # 修改状态 manager.func2() # is_on为False,不执行任何操作
这个方案的好处是把状态和函数逻辑绑定在一起,避免了全局变量的滥用,代码的封装性和可读性更好,尤其适合这些函数属于同一功能模块的场景。
方案3:闭包封装(更安全的状态管理)
如果你偏好函数式编程风格,可以用闭包来封装is_on状态,外部只能通过指定的方法修改状态,进一步提升代码的安全性:
def create_function_set(): is_on = True # 闭包内的状态变量,外部无法直接修改 # 闭包内的装饰器 def run_if_on(func): def wrapper(): nonlocal is_on if is_on: return func() return wrapper @run_if_on def func1(): print("func1 执行啦") @run_if_on def func2(): print("func2 执行啦") @run_if_on def func3(): print("func3 执行啦") # 提供修改状态的接口 def set_is_on(status): nonlocal is_on is_on = status # 返回函数和状态修改方法 return func1, func2, func3, set_is_on # 使用方式 func1, func2, func3, set_is_on = create_function_set() func1() # 正常执行 set_is_on(False) # 通过接口修改状态 func2() # 不再执行
这个方案里,is_on变量被封闭在闭包内部,外部无法直接修改,只能通过set_is_on方法来调整状态,避免了意外修改状态的风险,同时也消除了全局变量。
以上三种方案都能有效消除代码重复,你可以根据自己的代码场景选择最合适的一种~
内容的提问来源于stack exchange,提问作者user9721253
相关产品推荐
相关产品推荐

