编码风格——用python编写if else的更优雅的方式



例如,如果我有代码:

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 

是否有更优雅/python的方式来编写函数b(self) ?

首先,去掉不必要的括号;它们只会让你的代码结构更难遵循:

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

然后移除引起SyntaxError升高的杂散':

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

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

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

接下来,如果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))

或者:

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'

如果你有两个以上的可能性,可能值得把东西放在dict中,而不是使用if/elif链,或者编写动态代码。例子:

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())

注意,它们对上一个问题做出了不同的选择。dict版本将为未知值引发KeyError;format版本将把所有内容视为有效

同样,如果你使用dict,你可能想把它移到b函数之外。,让它成为一个类属性(这也鼓励你给它一个好名字)。

然而,只有两个选择,我认为你的选择更清楚。

最后,给函数取无意义的单字母名字不是很python;最好这样做:

def get_formatted_order(self):
    order = self.calculate_order()
    if order == 'Buy':
        return 'BUY SET'
    elif order == 'Sell':
        return 'SELL SET''

你可以使用字典:

def b(self):
    return {'Buy': "BUY SET", 'Sell': "SELL SET"}.get(self.a())

或者写得更清楚:

def b(self):
    d = {"Buy": "BUY SET",
        "Sell": "SELL SET"}
    return d.get(self.a())

虽然abarnet的答案绝对是最结论性的,但对于给定的代码,这也可以工作:

def b(self):
    return self.a().upper() + " SET"

但这是在做很多假设,这些假设并不是很普遍

为什么不直接缓存呢?

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

我也会给你的变量一个清晰的名字。ab根本不是描述性的

在abarnert给出的这些很酷的建议之后,您可以再尝试一个缩短代码的技巧。

def get_formatted_order(self):
    order = self.calculate_order()        
    return 'BUY SET' if order == 'Buy' else 'SELL SET'

这是三元运算符的python形式。如果订单计算为'Buy',函数将返回'Buy SET'。反之,它将返回'SELL SET'

最新更新