Python 如果其他方法在一行中成功,则从方法返回

Python 如果其他方法在一行中成功,则从方法返回,python,python-decorators,program-flow,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_somet

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

我的类中的许多方法如下所示:

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
    …
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
其中
self.try\u something
返回
True
False

有没有一种方式可以用这样的方式来表达:

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
    …
我在摆弄装潢师和上下文管理器来实现这一点,但没有成功,但我仍然相信“一定有更好的方法!”

但是你要么需要事先知道你的
事情
。。或者使用函数调用中的表达式计算它们


但是你要么需要事先知道你的
事情
。。或者使用函数调用中的表达式计算它们。

看起来像是
itertools

当你说method时,我假设这是一个类的方法,因此代码可以如下所示:

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
    …
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

希望
其他东西
不太难计算。

看起来像是
itertools
来拯救:

当你说method时,我假设这是一个类的方法,因此代码可以如下所示:

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
    …
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

希望
其他东西
不太难计算。

希望这个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')

根据
a
b
的实际情况,您可能需要尝试@quamrana提到的连接或展平/添加或链接的方法。

希望此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')

根据
a
b
的实际情况,您可能需要像@quamrana提到的那样,尝试连接或展平/添加或链接的方法。

您可以填充
,如果是self。尝试一些事情:将
返回到一行,就像那样,将
返回到同一行,但在大多数情况下,它对可读性并没有真正的帮助。尝试使用
try\u something\u和\u return
方法代表调用方返回会更糟糕。@Davit我希望它只返回(如第一个代码段中所述)。如果self,可以填充
。try\u something(某物):将
return
移动到同一行,将
返回到一行,就像这样,但在大多数情况下,它对可读性并没有真正的帮助。尝试使用
try\u something\u和\u return
方法代表调用方返回会更糟糕。@Davit我希望它只返回(如第一个代码段中所示)。