2013-01-10 35 views
0

例如,如果我的代码:更优雅的方式来写,如果其他人在python

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 

有没有我可以写函数B(个体经营)更优雅/ Python的方式?

+1

删除不需要的parens并在比较之前存储'result = self.a()'(个人偏好)。有一个else子句可能也有用。 – mmgp

+3

我认为,作为一个开始,“更优雅/ pythonic”的事情将是使用有意义的名字。 – 2013-01-10 23:58:41

回答

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

但是,如果'a'只能返回''Buy''或''Sell'',那么使用'if-else'子句而不是'if-elif'子句会更好。 – Volatility

+0

@Volatility:以“接下来,如果'a'返回......”开头的段落是为了解决这个问题。但也许它应该更明确?我会尝试重写它;谢谢。 – abarnert

+0

Geeze。已经下了演讲讲台^^(一个很好的全面答案。) – 2013-01-11 00:06:55

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个选择,我会犹豫称这更“优雅/ pythonic”.. – 2013-01-10 23:58:12

+0

@Marcin这就是为什么我用'get' - 默认为'None' – l4mpi

+0

这是短暂的,看起来没问题,但你是没有必要的启动一本字典。 – ajon

1

为什么不只是缓存它呢?

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

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

我会给你的变量清晰的名字以及。 ab根本没有描述性。

2

虽然abarnet的答案肯定是最确凿,对于给定的代码,这也将工作:

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

但是,这使得很多不是非常普及的假设。

+0

这相当于我的答案中的一个选项,除了我使用'format'而不是连接。将它拉出来作为单独的答案有助于突出它作为一种可能性,但我不确定它是否值得突出显示。 – abarnert

1

毕竟所有酷推荐abarnert制造here你可以尝试一个更多的技巧来缩短你的代码。

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

这是三元运算符的pythonic形式。如果订单评估为“购买”功能将返回“购买设置”。在相反的情况下,它会返回'卖出套'

相关问题