自动化脚本按步骤执行 12345,如果 4 失败想回到 2,有哪些实现方法

2021-01-28 11:00:44 +08:00
 bytesfold
3641 次点击
所在节点    Python
16 条回复
no1xsyzy
2021-01-28 11:10:50 +08:00
1#. Finite State Machine (FSM)

2#. retry flag (reverse also ok)
1
retry_2_thru_4 = true
while (retry_2_thru_4) {
2
3
if (4) retry_2_thru_4 = false;
}
5
bytesfold
2021-01-28 11:24:52 +08:00
@no1xsyzy 第二种方法不够优雅,第一种方法好难,够我喝一壶了,想知道有没有实现过的库
no1xsyzy
2021-01-28 11:38:02 +08:00
@bytesfold 第二种方法很正常,从很久以前(从 Dijkstra 反对 goto 观点被广泛使用之后)就是这么用的了
如果你觉得不够优雅,那就把 234 封装到一个函数里去,甚至把循环也带进去,跳出直接 return 。

第一种方法就是无限 goto 制,其实单这个还没到该用 FSM 的程度。
这就是个很简单的逻辑
yuelang85
2021-01-28 11:55:28 +08:00
你把每一步封装成一个函数,然后:

func_list = [
(func_1, None),
(func_2, func_1),
(func_3, func_1),
(func_4, func_2),
]

for f, f_err in func_list:
try:
f()
except:
f_err()
ytymf
2021-01-28 12:16:30 +08:00
上状态机吧,没那么难,画好状态以及状态迁移图,能理顺就能写好。
frostming
2021-01-28 13:02:41 +08:00
@bytesfold 第二种很优雅,难道 goto 才是你要的优雅?
1
while True:
2
3
if 4:
break
5
est
2021-01-28 13:20:47 +08:00
这种情况当然是 Goto 大法好

https://pypi.org/project/goto-statement/
freelancher
2021-01-28 13:42:30 +08:00
我是写 SHELL 脚本的。12345 每一步的最后给一个状态码。 然后 4 的状态码为 0 是成功。为 1 是错误的。然后写一个==判断就可以了。如果错了再回 2 步骤。

思路是这样。我不知道大家能不能懂的我意思。
cpstar
2021-01-28 14:13:25 +08:00
@yuelang85 如果这样的话,那就可以继续封装函数了
invoke(func, succ, err) { if (func()) succ() else err() }
然后就成了
invoke(func_1, invoke(func_2, invoke(func_3, invoke(func_4, null, func_2), null), null), null)
null 根据实际情况继续配置

[套娃警告]
cpstar
2021-01-28 14:14:39 +08:00
感觉 LZ 的想法应该是 4 失败了,要回退到 2 运行之前的状况
yuelang85
2021-01-28 15:05:19 +08:00
@cpstar 这调用栈太复杂了。成函数式了。

要是状态回滚,那就复杂了,看具体做了什么。。。。
deplives
2021-01-28 16:15:23 +08:00
如果 12345 当成成不同的状态,不就是个状态机了?
zepc007
2021-01-28 18:26:16 +08:00
jump,jump,jump
q197
2021-01-28 19:29:07 +08:00
goto 完美
ideno
2021-01-28 19:44:02 +08:00
int nProc = 0;
while (true) {
swith(nProc) {
case 0: doProc0();
case 1: doProc1();
case 2: doProc2();
case 3: doProc3();
case 4: if(!doProc4()) {nProc=2; continue;}
}
break;
}

@freelancher 说的大概这么个意思(不是正确语法)
HelloViper
2021-01-29 10:11:38 +08:00
transitions==0.8.1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/749151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX