use*_*339 0 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
Run Code Online (Sandbox Code Playgroud)
是否有更优雅/ pythonic的方式我可以写函数b(自我)?
aba*_*ert 14
首先,摆脱不必要的括号; 他们只是让你的代码结构更难遵循:
def b(self):
if self.a() == 'Buy':
return 'BUY SET'
elif self.a() == 'Sell':
return 'SELL SET''
Run Code Online (Sandbox Code Playgroud)
然后删除'导致它引发的那个迷路SyntaxError:
def b(self):
if self.a() == 'Buy':
return 'BUY SET'
elif self.a() == 'Sell':
return 'SELL SET'
Run Code Online (Sandbox Code Playgroud)
接下来,不要再打self.a()两次电话.虽然它在这里是无害的,但在实际代码中它很有可能产生副作用 - 或者至少需要花费足够长的时间才能浪费时间:
def b(self):
order = self.a()
if order == 'Buy':
return 'BUY SET'
elif order == 'Sell':
return 'SELL SET'
Run Code Online (Sandbox Code Playgroud)
接下来,如果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))
Run Code Online (Sandbox Code Playgroud)
或者可能:
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'
Run Code Online (Sandbox Code Playgroud)
如果您有两种以上的可能性,那么将内容放入dict而不是使用if/ elifchain或编写动态代码可能是值得的.例子:
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())
Run Code Online (Sandbox Code Playgroud)
请注意,这些为前一个问题做出了不同的选择.该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''
Run Code Online (Sandbox Code Playgroud)