例如,如果我有代码:
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''
我也会给你的变量一个清晰的名字。a
和b
根本不是描述性的
在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'