撤消一系列步骤中先前步骤的最佳方法

2024-05-18 23:08:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到一个更好的方法来执行以下函数。我有一系列需要完成的步骤,如果有失败的话,我需要像这样撤销前一步:

try:
    A = createA()
except:
    return None

try:
    B = createB(A)
except:
    deleteA(A)
    return None

try:
    C = createC(B)
except:
    deleteB(B)
    deleteA(A)
    return None

try:
    D = createD(C)
except:
    deleteC(C)
    deleteB(B)
    deleteA(A)
    return None

return D

如果可能的话,我不想重复我的话。我该如何改进?有一个已知的模式可以遵循吗?你知道吗

我考虑过的一件事是将deleteB(添加到deleteC(),将deleteA()添加到deleteB()。这是最好的办法吗?你知道吗


Tags: 方法函数nonereturn模式步骤trycreated
3条回答

这取决于“撤消”的确切含义。例如,如果A、B、C、D等是任意的用户命令,并且可能有大量的命令以任何顺序排列,那么您可能需要围绕do/undo编写某种抽象。你知道吗

如果A、B、C、D等是需要整理的资源(数据库连接、文件等),那么上下文管理器可能更合适。你知道吗

或者A,B,C,D是其他类型的东西。你知道吗

使用上下文管理器的简短代码:

class A:
    def __enter__(self):
        set things up
        return thing
    def __exit__(self, type, value, traceback):
        tear things down

class B, C and D are similar

def doSomethingThatNeedsToUseD():
    try:
        with A() as a:
        with B() as b:
        with C() as c:
        with D() as d:
            d.doSomething()
    except:
        print("error")

正如评论所指出的,这就是上下文管理器协议的用途。但是,如果您还不想深入了解什么是相当高级的特性,那么您可以在运行时定义lambda匿名函数,以记住要整理的内容。。。你知道吗

try:
    deleters = []
    A = createA()
    deleters.append( lambda: deleteA(A) )
    B = createB( A)
    deleters.append( lambda: deleteB(B) )
    C = createC( B)
    deleters.append( lambda: deleteC(C) )
    D = createD( C)
    return D
except:
    for d in reversed( deleters):
        d()
    return None

如果您查看一些设计模式,请检查以下内容:

Command pattern

这可能就是你正在寻找的。此外,它的命令可以有“撤消”操作。如果下面的问题与您的问题相似,也请检查。best design pattern for undo feature

相关问题 更多 >

    热门问题