例如,如果我有代码:
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(自我)?
答案 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''
我也会给你变量清晰的名字。 a
和b
根本不具有描述性。
答案 4 :(得分:1)