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