假设我有以下代码:
var = foo()
if var:
return var
var = bar()
if var:
return var
var = baz()
if var:
return var有没有更多的毕达通方法来解决这个问题?这样的一个很好的用例是检索用户设置。如果用户有屏幕类型的特定设置,那么就使用它。如果没有,请尝试获取用户的帐户范围的屏幕类型并使用它。如果没有,请使用系统范围的通用屏幕类型。
很明显,这个案子很小,很可能没问题。假设我有超过100个“案例”要签入优先级列表。我想我们都同意这可能会变得很荒谬。
编辑:对不起,如果这似乎是一个XY问题。在某种程度上,我想是的。这是百分之百的学术思想练习。我实际上没有一个具体的用例来解决这个问题。这只是昨晚我在想的事情,我想知道什么是最毕达通的方法。
发布于 2016-04-20 14:22:34
我认为even 161151的解决方案很好,但是如果您更愿意维护几十个甚至100个函数,您可以这样做:
lst = [foo, bar, baz, ...] # add to this list
for func in lst:
v = func()
if v:
return v发布于 2016-04-20 14:17:41
return foo() or bar() or baz()应该这么做。
发布于 2016-04-20 14:19:14
您可以迭代这些函数,并获得返回布尔True的第一个函数。
var = next(filter(None, (fn() for fn in (foo, bar, baz))))
编辑:当我测试它时,它就崩溃了,然后我意识到在Python2.x过滤器中返回一个列表,而在Python3.x过滤器中,它返回一个生成器。有关Python2.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
>>> https://stackoverflow.com/questions/36746612
复制相似问题