0

例如,如果我有代码:

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

4

5 回答 5

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'or之外的任何内容'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'

如果您有两种以上的可能性,则可能值得将事物放入 adict而不是使用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版本只会将任何内容视为有效。

此外,如果您使用 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''
于 2013-01-10T23:59:34.013 回答
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())
于 2013-01-10T23:57:36.273 回答
2

尽管 abarnet 的答案绝对是最有说服力的,但对于给定的代码,这也可以:

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

但这做出了很多不是很普遍的假设。

于 2013-01-11T00:11:02.117 回答
1

为什么不直接缓存呢?

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

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

我也会给你的变量起清晰的名字。a并且b根本不是描述性的。

于 2013-01-11T00:00:02.023 回答
1

在abarnert这里提出所有很酷的建议之后,您可以尝试另一种缩短代码的技巧。

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

这是三元运算符的pythonic形式。如果订单评估为“购买”,函数将返回“购买设置”。在相反的情况下,它将返回“SELL SET”

于 2013-01-23T18:32:16.257 回答