【问题标题】:Return from method if other method succeeds with one line如果其他方法以一行成功则从方法返回
【发布时间】:2017-10-12 20:09:19
【问题描述】:

我无法为这个问题找到合适的标题,所以请原谅我。

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

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

我一直在摆弄装饰器和上下文管理器来实现这一点,但没有成功,但我仍然相信“一定有更好的方法!”。

【问题讨论】:

  • 您可以像这样将if self.try_something(something): return 放在一行中,方法是将return 移到同一行,但大多数情况下它并不能真正提高可读性。试图让一个代表其调用者返回的try_something_and_return 方法会更糟。
  • @Davit 我希望它只返回(如在第一个代码 sn-p 中)。

标签: python python-decorators program-flow


【解决方案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 不会太难计算。

【讨论】:

    【解决方案2】:

    希望这个 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 提到的连接或展平/添加或链接的方法。

    【讨论】:

      【解决方案3】:
      if self.try_something(a_thing) or self.try_something(another_thing):
          return
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 1970-01-01
        • 2014-12-14
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        相关资源
        最近更新 更多