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

作者: flarehunter (Range)   2017-10-21 16:28:51
試著用 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,卻還是一頭霧水。
: 謝謝。

Links booklink

Contact Us: admin [ a t ] ucptt.com