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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:48:02