Pythonic 方式到 "run X before Y if Y fails"?

标签 python

我正在寻找一种更好的方法来实现这种逻辑:

if not a():
    if not b():
        c()
        b()
    a()

另一种形式:

try:
   a()
except:
   try:
      b()
      a()
   except:
      c()
      b()
      a()

换句话来说,“尝试运行 A。如果我们不能执行 A,我们需要先执行 B。如果我们不能执行 B,我们需要先执行 C,等等。”

最佳答案

不确定您是否对此感觉“更好”;这是一个替代方案。我相信有些人喜欢,有些人不喜欢。

a() or (b(),a())[0] or (c(),b(),a())[0]

这是验证测试:

def a(ret):
    print 'run a, a succeeded?', ret
    return ret

def b(ret):
    print 'run b, b succeeded?', ret
    return ret

def c(ret):
    print 'run c, c succeeded?', ret
    return ret

还有

a(False) or (b(False),a(False))[0] or (c(True),b(False),a(False))[0]

给出

run a, a succeeded? False
run b, b succeeded? False
run a, a succeeded? False
run c, c succeeded? True
run b, b succeeded? False
run a, a succeeded? False

还有

a(False) or (b(True),a(False))[0] or (c(True),b(True),a(False))[0]

给出

run a, a succeeded? False
run b, b succeeded? True
run a, a succeeded? False

关于Pythonic 方式到 "run X before Y if Y fails"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800804/

相关文章:

python - 编译 Python

python - 如果来自 Python 字典的子类,LRU 缓存不可散列类型

Python Flask - 是否可以仅使用Python创建个人网站?

python - 是否可以在 Selenium 和 Chrome 网络驱动器上禁用加载图像(仅限 jpg 和 png)?

python - 无法使用py2neo删除具有关系的neo4j节点

Python异步: Future vs Task

python - 如何使用 patch.PathPatch 指定矩形的颜色列表?

python - 在 Pycharm 中如何将代码加载到交互式调试器?

python - 什么是迭代器、可迭代和迭代?

python - 如何调试 Openstack 仪表板?