如果其他方法成功使用一行,则从方法返回

时间:2017-10-12 20:09:20

标签: python python-decorators program-flow

我很难找到这个问题的合适标题,所以请原谅我。

我班上的很多方法都是这样的:

def one_of_many():
    # code to determine `somethings`
    for something in somethings:
        if self.try_something(something):
            return
    # code to determine `something_else`
    if self.try_something(something_else):
        return
    …

其中self.try_something返回TrueFalse

有没有办法用以下方式表达:

def one_of_many():
    # code to determine `somethings`
    for something in somethings:
        self.try_something_and_return(something) # this will return from `one_of_many` on success
    # code to determine `something_else`
    self.try_something_and_return(something_else) # this will return from `one_of_many` on success
    …

我正在摆弄装饰人员和情境管理人员,以便在没有成功的情况下实现这一目标,但我仍然相信"必须有更好的方式!"。

3 个答案:

答案 0 :(得分:1)

拯救看起来像itertools

当你说方法时,我假设这是一个类的方法,所以代码看起来像这样:

import itertools

class Thing:
    def one_of_many(self):
        # code to determine `somethings`
        for something in itertools.chain(somethings,[something_else]):
            if self.try_something(something):
                return

希望something_else计算起来并不太难。

答案 1 :(得分:1)

希望这个mcve模仿你的问题:

a = [1,2,3]
b = 3
def f(thing):
    print(thing)
    return False

class F:
    pass

self = F()
self.trysomething = f

将方法映射到所有内容,如果有任何返回True

,请采取措施
if any(map(self.trysomething, a + [b])):
    print('yeay')
else:
    print('nay')

根据ab的实际情况,您可能需要使用@quamrana提及的方法来连接或展平/添加或链接。

答案 2 :(得分:0)

if self.try_something(a_thing) or self.try_something(another_thing):
    return

但是你要么事先要知道你的thing,要么用函数调用中的表达式来计算它们。