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