当变量在python中更改时退出代码块

时间:2015-08-06 08:45:27

标签: python

当var变为False时,我遇到需要退出代码块的问题。 例如

...
var = True
var, msg = somefunction1(x)
var, msg = somefunction2(y)
var, msg = somefunction3(z)
...

somefunction *可以返回True或False。当var变为False时,有没有办法在每行之后添加if语句来退出此块?

P.S。有很多功能,它们的名称不同。

2 个答案:

答案 0 :(得分:3)

我不得不猜一点,因为我在你的例子中缺少一些上下文,但你可以使用一个函数列表和一个循环? (这仍然涉及一个if,因为替代方案更加混乱)

functions = [somefunction1, somefunction2, somefunction3]

for func in functions:
    var, msg = func()
    if not var:
        break

那样的东西?

但我的意思是,如果你真的讨厌陈述:

functions = [somefunction1, somefunction2, somefunction3]

i = 0
var = True

while var and i < len(functions):
    var, msg = func()
    i += 1

基于更新,并且不愿意将函数直接写入列表,您可以(但不应该 - 严重地,只列出函数)执行类似这样的操作(这假设所有函数都使用没有参数,如果不是,则将argcount检查更改为预期的参数:

functions = [x for x in globals().values()
             if hasattr(x, '__call__') and 
                hasattr(x, "__code__") and 
                x.__code__.co_argcount == 0]

for func in functions:
    try:
        var, msg = func()
    except (ValueError, TypeError):
        continue

    if not isinstance(var, bool) or not isinstance(msg, str):
        continue

    if not var:
        break

你可以重写第一行,但我还没有确定哪个版本的攻击性/安全性较低:

functions = [x for x in globals()["functions"]
             if  x.__code__.co_argcount == 0]

但要重申 - 只因为你能做到这一点,并不意味着你应该这样做。我的意思是看它,它是一种可憎的。

答案 1 :(得分:1)

这样的事情可能对你有帮助,虽然这取决于你如何调用所有函数(在这种情况下,没有参数)。

functions = [f0, f1, f2, ...]
for f in functions:
    var, msg = f()
    if not var:
        break