【发布时间】:2019-06-25 03:44:46
【问题描述】:
我正在尝试找到一种更好的方法来执行以下功能。我有一系列步骤需要完成,如果有任何失败,我需要像这样撤消上一步:
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()。这是最好的方法吗?
【问题讨论】:
-
一种可以使用的模式可能是 上下文管理器,您可以使用
__enter__和__exit__- 您可能已经像with open(...) as file_:一样使用过它,例如,在哪里它用于为您关闭文件。 -
从 Python 3.3 开始,
contextlib.ExitStack与上下文管理器结合使用。 -
一种方法是你可以编写一个撤销函数,它包含你所有的
deleteX()函数,并像undo([C, B, A])一样调用它,它解析你的对象以删除并相应地调用deleteX()。虽然这可能不是最佳方法。 -
我不知道 python,但一些与 goto 等效的方法实际上是一个很好的解决方案,即使它不赞成。通用标准见here
标签: python optimization design-patterns coding-style