在python中写if else的更优雅方式

use*_*339 0 python coding-style

例如,如果我有代码:

class Example ():

    def a(self):
        return 'Buy'

    def b(self):
        if (self.a() == 'Buy'):
            return 'BUY SET'
        elif (self.a() == 'Sell'):
            return 'SELL SET''

o = Example()
value = o.b()   
print value 
Run Code Online (Sandbox Code Playgroud)

是否有更优雅/ pythonic的方式我可以写函数b(自我)?

aba*_*ert 14

首先,摆脱不必要的括号; 他们只是让你的代码结构更难遵循:

def b(self):
    if self.a() == 'Buy':
        return 'BUY SET'
    elif self.a() == 'Sell':
        return 'SELL SET''
Run Code Online (Sandbox Code Playgroud)

然后删除'导致它引发的那个迷路SyntaxError:

def b(self):
    if self.a() == 'Buy':
        return 'BUY SET'
    elif self.a() == 'Sell':
        return 'SELL SET'
Run Code Online (Sandbox Code Playgroud)

接下来,不要再打self.a()两次电话.虽然它在这里是无害的,但在实际代码中它很有可能产生副作用 - 或者至少需要花费足够长的时间才能浪费时间:

def b(self):
    order = self.a()
    if order == 'Buy':
        return 'BUY SET'
    elif order == 'Sell':
        return 'SELL SET'
Run Code Online (Sandbox Code Playgroud)

接下来,如果a返回任何东西,'Buy'或者'Sell',你将返回None.这真的是你想要的吗?你如何解决这个问题取决于你真正想要的.例如,您可能需要:

def b(self):
    order = self.a()
    if order == 'Buy':
        return 'BUY SET'
    elif order == 'Sell':
        return 'SELL SET'
    else:
        raise ValueError("Unexpected order type '{}'".format(order))
Run Code Online (Sandbox Code Playgroud)

或者可能:

def b(self):
    order = self.a()
    if order == 'Buy':
        return 'BUY SET'
    else: # We know there's nothing else it could be
        return 'SELL SET'
Run Code Online (Sandbox Code Playgroud)

如果您有两种以上的可能性,那么将内容放入dict而不是使用if/ elifchain或编写动态代码可能是值得的.例子:

def b(self):
    return {'Buy': 'BUY SET', 'Sell': 'SELL SET', 'Trade': 'TRADE SET',
            'Barter': 'BARTER SET', 'Steal': 'STEAL SET'}[self.a()]

def b(self):
    return '{} SET'.format(order.upper())
Run Code Online (Sandbox Code Playgroud)

请注意,这些为前一个问题做出了不同的选择.该dict版本将提出一个KeyError未知值; 该format版本只会将任何内容视为有效.

另外,如果你使用a dict,你可能想把它移到b函数之外- 例如,把它变成一个类属性(这也鼓励你给它一个好名字).

但是,只有两种选择,我认为你所拥有的更清楚.

最后,赋予函数毫无意义的单字母名称并不是非常pythonic; 做这样的事情会更好:

def get_formatted_order(self):
    order = self.calculate_order()
    if order == 'Buy':
        return 'BUY SET'
    elif order == 'Sell':
        return 'SELL SET''
Run Code Online (Sandbox Code Playgroud)