假设我有以下代码:
var = foo()
if var:
return var
var = bar()
if var:
return var
var = baz()
if var:
return var
是否有更多的Pythonic方法来解决这个问题?这样的一个很好的用例就是检索用户设置。如果用户具有屏幕类型的特定设置,则使用它。如果没有,请尝试获取用户的帐户范围屏幕类型并使用它。如果没有,请使用系统范围的通用屏幕类型。
显然这种情况很小,可能还行。假设我有超过100个"个案"检查优先级列表。我想我们都同意这可能会变得荒谬。
编辑: 很抱歉,这似乎是一个XY问题。在某种程度上,我认为。这是100%的学术思想练习。我实际上没有具体的用例。这是我昨晚想到的事情,并且想知道最恐怖的方法是什么。
答案 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?