創建一個功能,如fallback_until_success(func_list)
,其中func_list = [a, b, c]
。如果您有參數,可以將它們綁定,例如通過傳遞(func, *args, **kwargs)
的元組。
然後,您可以在while循環中查看列表(包括每次迭代的後退 - 回溯),直到您獲得成功或點擊列表的末尾;如果你沒有成功,返回最後的異常(或異常列表)。
但是,這似乎是一種情況,即通過初始測試來通知您的代碼路徑比嘗試首先執行損壞和回溯更好。你在做的是濫用異常作爲消息傳遞服務。
更新:也爲時已晚,現在是這樣,但是這裏是一個具體的例子:
def fallback_until_success(func_list):
index = 0
results = []
exceptions = []
while (index < len(func_list)):
try:
print func_list[index::-1] # debug printing
for func_spec in func_list[index::-1]:
#func, args, kwargs = func_spec # args variant
#result = func(*args, **kwargs)
func = func_spec
result = func()
results.append(result)
break
except Exception, e:
exceptions.append(e)
index += 1
results = []
continue
break
return results, exceptions
# global "environment" vars
D = {
"flag1": False,
"flag2": False,
}
def a():
if not D["flag1"]:
failstr = "a(): failure: flag1 not set"
print failstr
raise Exception(failstr)
print "a(): success"
return D["flag1"]
def b():
if not D["flag2"]:
failstr = "b(): failure: flag2 not set"
print failstr
raise Exception(failstr)
else:
D["flag1"] = True
print "b(): success"
return D["flag2"]
def c():
D["flag2"] = True
print "c(): success"
return True
# args variant
#results, exceptions = fallback_until_success([(a, [], {}), (b, [], {}), (c, [], {})])
results, exceptions = fallback_until_success([a, b, c])
print results
print exceptions
輸出:
[<function a at 0x036C6F70>]
a(): failure: flag1 not set
[<function b at 0x03720430>, <function a at 0x036C6F70>]
b(): failure: flag2 not set
[<function c at 0x037A1A30>, <function b at 0x03720430>, <function a at 0x036C6F70>]
c(): success
b(): success
a(): success
[True, True, True]
[Exception('a(): failure: flag1 not set',), Exception('b(): failure: flag2 not set',)]
當然,這是基於例外,但你也可以修改這個以基於返回值的成功/失敗。
您正在運行'了'和'b '在引發異常之後運行的異常塊中。這對我來說是個不好的主意。 – tacaswell 2013-04-04 00:57:25
你的確切*問題/情況是什麼? – Blender 2013-04-04 00:58:28
所以如果'a()'失敗,'b()'可能會以某種方式成功運行'a()'?這讓我感到害怕......你有什麼確切的用例? – 2013-04-04 00:58:28