首先,我知道if和try之间的区别,我完全意识到他们的目的是完全不同的 - 一个人进行测试,另一个人管理错误。但是,在这种特殊情况下,使用if或尝试是否更好?
#option1
def getListRank(self):
for point in self.soup.findAll('td',class_="rank-cell"):
p = (point.get_text().replace('\t','').replace('\n','')
.replace('\r','').replace(',',''))
if 'T' in p:
self.listRk.append(int(p.replace('T',''))
else:
self.listRk.append(int(p))
return self.listRk
我很想使用下面的选项2,因为我知道可以阻止将p转换为整数的唯一原因是存在那个' T'。因此,写这个是不寻常的还是效率低的:
#option2
def getListRank(self):
for point in self.soup.findAll('td',class_="rank-cell"):
p = (point.get_text().replace('\t','').replace('\n','')
.replace('\r','').replace(',',''))
try:
self.listRk.append(int(p))
except:
self.listRk.append(int(p.replace('T',''))
return self.listRk
我问这些问题是因为我之前读过这些问题所以我认为它是" pythonic"。但是,如果有一条解释/惯例,我更感兴趣。
提前致谢
答案 0 :(得分:2)
不要使用任何一种。正如@tobias_k建议的那样删除T
和其他字符;然后你知道 int(p)
会成功。您也可以使用re.sub
更轻松地完成此操作,将其简化为使用列表推导而不是for
循环。
import re
to_replace = re.compile(r'\t|\n|\r|T|,')
def getListRank(self):
points = self.soup.findAll('td', class_="rank-cell")
self.listRk = [int(re.sub(to_replace, "", p.get_text())) for p in points]
return self.listRk
您还可以使用str.translate
删除您的字符集。
self.listRk = [int(p.get_text().translate(None, "\r\n\tT,")) for p in points]
答案 1 :(得分:0)
至少在CPython的翻译中,例外真的不会花费更多,而且有时更便宜,特别是如果测试需要更多的Python级别代码,而异常会被C隐式提升层功能。
选择if
检查异常的原因通常是风格问题;保存实际异常情况的异常,而不是通用控制流机制。也就是说,Python完全是EAFP,所以它倾向于将异常用于不太特殊的目的。
请为了上帝的爱,请不要使用裸露的除了积木。抓住你期望的例外,而不是更多,因为否则你会抓住永远不会被捕获的东西,例如:如果您将append
标记为apend
,则AttributeError
将被捕获。
当然,在您的特定情况下,您可以完全跳过测试。
self.listRk.append(int(p.replace('T',''))
毕竟是T
是否在你的字符串中。检查它是没有意义的,如果它在那里就摆脱它并转换为int
。