Re: [問題] 怎麼用 Python 寫出 switch 的功能?

作者: rexyeah (ccccccc)   2017-10-19 17:19:37
不知道這樣有符合嗎?
# 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,卻還是一頭霧水。
: 謝謝。
作者: rexyeah (ccccccc)   2017-10-19 17:34:00
for loop要縮排 貼上去亂了
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2017-10-19 20:24:00
看下來 這版本好像最簡單易懂
作者: henry8168 (番薯猴)   2017-10-20 09:56:00
可是這個沒有倒車 release 的部份啊 o_o"

Links booklink

Contact Us: admin [ a t ] ucptt.com