在python中我应该使用try或If和为什么?

时间:2015-08-07 11:32:21

标签: python if-statement try-catch convention

首先,我知道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"。但是,如果有一条解释/惯例,我更感兴趣。

提前致谢

2 个答案:

答案 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