V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bytesfold
V2EX  ›  Python

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

  •  
  •   bytesfold · 2021-01-28 11:00:44 +08:00 · 3633 次点击
    这是一个创建于 1176 天前的主题,其中的信息可能已经有所发展或是发生改变。
    16 条回复    2021-01-29 10:11:38 +08:00
    no1xsyzy
        1
    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
        2
    bytesfold  
    OP
       2021-01-28 11:24:52 +08:00
    @no1xsyzy 第二种方法不够优雅,第一种方法好难,够我喝一壶了,想知道有没有实现过的库
    no1xsyzy
        3
    no1xsyzy  
       2021-01-28 11:38:02 +08:00
    @bytesfold 第二种方法很正常,从很久以前(从 Dijkstra 反对 goto 观点被广泛使用之后)就是这么用的了
    如果你觉得不够优雅,那就把 234 封装到一个函数里去,甚至把循环也带进去,跳出直接 return 。

    第一种方法就是无限 goto 制,其实单这个还没到该用 FSM 的程度。
    这就是个很简单的逻辑
    yuelang85
        4
    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
        5
    ytymf  
       2021-01-28 12:16:30 +08:00   ❤️ 1
    上状态机吧,没那么难,画好状态以及状态迁移图,能理顺就能写好。
    frostming
        6
    frostming  
       2021-01-28 13:02:41 +08:00
    @bytesfold 第二种很优雅,难道 goto 才是你要的优雅?
    1
    while True:
    2
    3
    if 4:
    break
    5
    est
        7
    est  
       2021-01-28 13:20:47 +08:00
    这种情况当然是 Goto 大法好

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

    思路是这样。我不知道大家能不能懂的我意思。
    cpstar
        9
    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
        10
    cpstar  
       2021-01-28 14:14:39 +08:00
    感觉 LZ 的想法应该是 4 失败了,要回退到 2 运行之前的状况
    yuelang85
        11
    yuelang85  
       2021-01-28 15:05:19 +08:00
    @cpstar 这调用栈太复杂了。成函数式了。

    要是状态回滚,那就复杂了,看具体做了什么。。。。
    deplives
        12
    deplives  
       2021-01-28 16:15:23 +08:00
    如果 12345 当成成不同的状态,不就是个状态机了?
    zepc007
        13
    zepc007  
       2021-01-28 18:26:16 +08:00
    jump,jump,jump
    q197
        14
    q197  
       2021-01-28 19:29:07 +08:00
    goto 完美
    ideno
        15
    ideno  
       2021-01-28 19:44:02 +08:00   ❤️ 1
    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
        16
    HelloViper  
       2021-01-29 10:11:38 +08:00
    transitions==0.8.1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2818 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:28 · PVG 08:28 · LAX 17:28 · JFK 20:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.