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

时间:2013-01-10 23:56:02

标签: 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 

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

5 个答案:

答案 0 :(得分:14)

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

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函数之外 - 例如,把它变成一个类属性(这也鼓励你给它一个好名字)

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

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

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

答案 1 :(得分:4)

您可以使用字典:

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

答案 2 :(得分:2)

尽管abarnet的答案肯定是最具决定性的,但对于给定的代码,这也可以起作用:

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

但是这已经做了许多不太普遍的假设。

答案 3 :(得分:1)

为什么不只是缓存它?

def b(self):
    a = self.a()

    if a == 'Buy':
        return 'BUY SET'
    elif a == 'Sell':
        return 'SELL SET''

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

答案 4 :(得分:1)

在完成abarnert here所做的所有精彩推荐之后,您可以再尝试一种缩短代码的技巧。

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

这是三元运算符的pythonic形式。如果订单评估为“买入”,则返回“买入套餐”。在相反的情况下,它将返回'SELL SET'