看板 Python 關於我們 聯絡資訊
不知道這樣有符合嗎? # 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,卻還是一頭霧水。 : 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.221.35.72 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1508404779.A.7A1.html
rexyeah: for loop要縮排 貼上去亂了 10/19 17:34
Sunal: 看下來 這版本好像最簡單易懂 10/19 20:24
henry8168: 可是這個沒有倒車 release 的部份啊 o_o" 10/20 09:56