多次检查的Pythonic解决方案

时间:2016-04-20 14:14:59

标签: python

假设我有以下代码:

var = foo()
if var:
    return var

var = bar()
if var:
    return var

var = baz()
if var:
    return var

是否有更多的Pythonic方法来解决这个问题?这样的一个很好的用例就是检索用户设置。如果用户具有屏幕类型的特定设置,则使用它。如果没有,请尝试获取用户的帐户范围屏幕类型并使用它。如果没有,请使用系统范围的通用屏幕类型。

显然这种情况很小,可能还行。假设我有超过100个"个案"检查优先级列表。我想我们都同意这可能会变得荒谬。

编辑: 很抱歉,这似乎是一个XY问题。在某种程度上,我认为。这是100%的学术思想练习。我实际上没有具体的用例。这是我昨晚想到的事情,并且想知道最恐怖的方法是什么。

5 个答案:

答案 0 :(得分:4)

return foo() or bar() or baz()应该这样做。

答案 1 :(得分:3)

我认为user161151的解决方案很好,但如果你想维护几十个甚至100个功能,你可以这样做:

lst = [foo, bar, baz, ...]  # add to this list
for func in lst:
    v = func()
    if v:
        return v

答案 2 :(得分:2)

你可以迭代这些函数并获取第一个返回布尔值True的函数:

var = next(filter(None, (fn() for fn in (foo, bar, baz))))


编辑:当我测试它时,这对我来说崩溃了,然后我意识到在Python 2.x过滤器中返回一个列表,而在Python 3.x过滤器中返回一个生成器。有关Python 2.x示例,请参阅以下内容:

def f1():
    print 'called f1'
    return False

def f2():
    print 'called f2'
    return None

def f3():
    print 'called f3'
    return 'yay'

def f4():
    print 'called f4'
    return 'yay1'

from itertools import ifilter

var = next(ifilter(None, (fn() for fn in (f1, f2, f3, f4))))
print var

输出:

called f1
called f2
called f3
yay
>>> 

答案 3 :(得分:0)

for f in [foo, bar, baz]:
    t = f()
    if t:
        return t

答案 4 :(得分:0)

如果函数的数量可以无限增长,我可能会做类似的事情:

functions = [
    foo,
    bar,
    baz
]

for fn in functions:
    var = fn()
    if var:
        return var

# some sort of error handling maybe?