Re: [问题] 怎么用 Python 写出 switch 的功能?

楼主: rexyeah (ccccccc)   2017-10-20 11:20:37
增加原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,却还是一头雾水。
: : 谢谢。

Links booklink

Contact Us: admin [ a t ] ucptt.com