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

看板Python作者 (Range)時間6年前 (2017/10/21 16:28), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串11/11 (看更多)
試著用 context manager 實作 class ContextBase(object): """The base of the context manager.""" def __init__(self, name): self.name = name def __enter__(self): if not self.Initialize(): self.Release() raise Exception('Initialize %s failed' % self.name) return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is not None: self.Release() return False def Initialize(self): raise NotImplementedError def Release(self): raise NotImplementedError 使用上只要繼承ContextBase再實作Initialize和Release Method, 接著再用with context1, context2, ...:即可 完整版: https://gist.github.com/anonymous/18f0d078aa87bea34eadbb69a2d175e7 輸出: Initialize 1: True Initialize 2: False Release 2 Release 1 result: False ※ 引述《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.231.189.190 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1508574534.A.8D8.html
文章代碼(AID): #1PwmL6ZO (Python)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 11 之 11 篇):
文章代碼(AID): #1PwmL6ZO (Python)