2017-10-12 80 views
0

我很难找到适合此问题的标题,所以请原谅我。如果其他方法成功用一行返回方法

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

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 
    … 

我用的装饰和背景的经理摆弄要做到这一点,但没有成功,但我仍然认为,“必须有一个更好的办法! ”。

+1

通过将'return'移动到同一行上,你可以将'self.try_something(something):return'这样的东西放到一行上,但它在大多数情况下并不能真正帮助可读性。尝试拥有代表调用者返回的'try_something_and_return'方法会更糟。 – user2357112

+0

@Davit我希望它只是返回(如在第一个代码片段中)。 – balast

回答

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

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

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

希望这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。

相关问题