增加原po說的倒車
# Add rollback processes if hitting failed
def init1():
return 'init1'
def init2():
return 'init2'
def init3():
return False
def rollback(fs):
def release(f):
print f.__name__, ' released'
map(lambda f: release(f), list(reversed(fs)))
def switch(c):
func_cases = {
'case1': [init1, init2, init3],
'case2': [init1, init3, init2]
}
for f in func_cases[c]:
b = f()
if b:
print b, ' success'
else:
print f.__name__, ' fail'
rollback(func_cases[c][:func_cases[c].index(f)])
break
# Run your switch-case
switch('case2')
※ 引述《rexyeah (ccccccc)》之銘言:
: 不知道這樣有符合嗎?
: # predefined init process
: def init1():
: print 'init1'
: def init2():
: print 'init2'
: def init3():
: print 'init3'
: # mimic the switch fallthrough
: def switch(c):
: func_cases = {
: 'case1': [init1, init2],
: 'case2': [init1, init3]
: }
: for f in func_cases[c]:
: f()
: # run your switch-case
: switch('case1')
: ※ 引述《henry8168 (番薯猴)》之銘言:
: : 大家好。
: : 很多人都說 if else 已經很夠用了,不需要 switch,
: : 但 C 語言的 switch 有一個特點就是,如果每個 case 不加上 break,
: : 就能夠繼續執行下方其他 case 的行為。
: : 尤其寫 kernel module 的人,
: : 應該常常會需要在 initial 階段控管初始化失敗時的狀況。
: : 打個比方,很多開發者都會很喜歡用 goto。
: : int init_phase(){
: : char* errfunc = "functionNameHere";
: : if(init_process1() < 0){
: : errfunc = "init_process1";
: : goto fail_p1;
: : }
: : if(init_process2() < 0){
: : errfunc = "init_process2";
: : goto fail_p2;
: : }
: : if(init_process3() < 0){
: : errfunc = "init_process3";
: : goto fail_p3;
: : }
: : return 0;
: : init_process3:
: : release_process2();
: : init_process2:
: : release_process1();
: : init_process1:
: : printf("%s: initial failed.\n",errfunc);
: : return -1;
: : }
: : 但不愛用 goto 的我就會改成以下:
: : int init_phase(){
: : char* errfunc = "functionNameHere";
: : int errOccur = 0;
: : if(!errOccur){
: : if(init_process1() < 0){
: : errfunc = "init_process1";
: : errOccur = 1;
: : }
: : }
: : if(!errOccur){
: : if(init_process2() < 0){
: : errfunc = "init_process2";
: : errOccur = 1;
: : }
: : }
: : if(!errOccur){
: : if(init_process3() < 0){
: : errfunc = "init_process3";
: : errOccur = 1;
: : }
: : }
: : if(!errOccur)
: : return 0;
: : switch(errfunc){
: : case "init_process3":
: : release_process2();
: : case "init_process2":
: : release_process1();
: : case "init_process1":
: : printf("%s: initial failed.\n",errfunc);
: : }
: : return -1;
: : }
: : 抱歉,在 Python 板打這麼多 C 語言 @@"
: : 不過我想表達的就如同上述,請問 Python 該怎麼做到類似的功能呢?
: : 我正在改一位同仁的 Python,想運用類似 switch 的特點完成。
: : 查到很多人都說可以用 dict,卻還是一頭霧水。
: : 謝謝。