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

楼主: lizkarina (lizka)   2017-10-19 15:55:27
※ 引述《kenduest (小州)》之铭言:
: ※ 引述《henry8168 (番薯猴)》之铭言:
: : 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,却还是一头雾水。
: : 谢谢。
: 类似这个方式吗?
: entry = { "init_process3": release_process2,
: "init_process2": release_process1,
: "init_process2": initial_fail,
: }
: handler = entry.get(errfunc)
: if handler:
: handler()
: return -1
修改后,有保证顺序。
from collections import OrderedDict
entry = OrderedDict()
entry["init_process3"] = release_process2
entry["init_process2"] = release_process1
entry["init_process1"] = initial_fail
keys = list(iter(entry))
if errfunc not in entry:
return -1
start = keys.index(errfunc)
for i in range(start, len(keys)):
entry.get(keys[i])()
我对op的理解是满足某个条件后执行一系列commad
command的顺序是"固定",
条件的存在是为了找出从哪个command开始做。
因此,也可以是:
commands = [release_process2, release_process1, "break", initial_fail]
cases = {"initial_process3": 0,
"initial_process2": 1}
try:
start = cases[errfunc]
except KeyError:
return -1
else:
for command in commands[start:]:
try:
command()
except TypeError:
break
然后可以再包成class或function,变形可以有很多种。
作者: djshen (djshen)   2017-10-19 16:15:00
这样没有保证顺序会是init_process3, 2, 1吧
楼主: lizkarina (lizka)   2017-10-19 16:20:00
对,要修一下。

Links booklink

Contact Us: admin [ a t ] ucptt.com