在 Python 中避免多个 Try/Except 块
Avoiding Multiple Try/Except blocks in Python
我有一个工作代码,但发现有许多 try/except 块来处理异常非常低效。有一个更好的方法吗?
下面粘贴了我目前使用的代码。我应该做一个自定义函数还是 for 循环?如何创建一个?
由于要求,代码已被缩短...
rows = []
rows.append(['Name','Weight', 'Height', 'Season', 'Age', 'Tm', 'Lg', 'Pos', 'G', 'GS', 'MP', 'FG', 'FGA' , 'FGP' , 'P3' , 'PA3' , 'PP3' , 'P2' , 'PA2', 'PP2', 'eFGP' , 'FT', 'FTA' , 'FTP', 'ORB', 'DRB' , 'TRB', 'AST' , 'STL', 'BLK', 'TOV', 'PF' , 'PTS'])
for result in results[1:len(results)]:
Name = soup.find(name="h1", attrs={"itemprop":"name"}).text.strip()
Weight = soup.find(name="span", attrs={"itemprop":"weight"}).text.strip()
Height = soup.find(name="span", attrs={"itemprop":"height"}).text.strip()
# find all columns per result
# data = result.find_all('td')
try:
season = result.find_all('a')[0]
season = season.getText()
except:
season = 'NA'
# check that columns have data
# if len(data) == 0:
# continue
Season = season
Age_find = result.find_all('td', attrs={'data-stat': 'age'})
Tm_find = result.find_all('td', attrs={'data-stat': 'team_id'})
Lg_find = result.find_all('td', attrs={'data-stat': 'lg_id'})
Pos_find = result.find_all('td', attrs={'data-stat': 'pos'})
G_find = result.find_all('td', attrs={'data-stat': 'g'})
GS_find = result.find_all('td', attrs={'data-stat': 'gs'})
MP_find = result.find_all('td', attrs={'data-stat': 'mp_per_g'})
FG_find = result.find_all('td', attrs={'data-stat': 'fg_per_g'})
FGA_find = result.find_all('td', attrs={'data-stat': 'fga_per_g'})
FGP_find = result.find_all('td', attrs={'data-stat': 'fg_pct'})
P3_find = result.find_all('td', attrs={'data-stat': 'fg3_per_g'})
PA3_find = result.find_all('td', attrs={'data-stat': 'fg3a_per_g'})
PP3_find = result.find_all('td', attrs={'data-stat': 'fg3_pct'})
P2_find = result.find_all('td', attrs={'data-stat': 'fg2_per_g'})
PA2_find = result.find_all('td', attrs={'data-stat': 'fg2a_per_g'})
PP2_find = result.find_all('td', attrs={'data-stat': 'fg2_pct'})
eFGP_find = result.find_all('td', attrs={'data-stat': 'efg_pct'})
FT_find = result.find_all('td', attrs={'data-stat': 'ft_per_g'})
FTA_find = result.find_all('td', attrs={'data-stat': 'fta_per_g'})
FTP_find = result.find_all('td', attrs={'data-stat': 'ft_pct'})
ORB_find = result.find_all('td', attrs={'data-stat': 'orb_per_g'})
DRB_find = result.find_all('td', attrs={'data-stat': 'drb_per_g'})
TRB_find = result.find_all('td', attrs={'data-stat': 'trb_per_g'})
AST_find = result.find_all('td', attrs={'data-stat': 'ast_per_g'})
STL_find = result.find_all('td', attrs={'data-stat': 'stl_per_g'})
BLK_find = result.find_all('td', attrs={'data-stat': 'blk_per_g'})
TOV_find = result.find_all('td', attrs={'data-stat': 'tov_per_g'})
PF_find = result.find_all('td', attrs={'data-stat': 'pf_per_g'})
PTS_find = result.find_all('td', attrs={'data-stat': 'pts_per_g'})
try:
Age = Age_find[0].getText()
except:
Age = 'NA'
try:
Tm = Tm_find[0].getText()
except:
Tm = 'NA'
try:
Lg = Lg_find[0].getText()
except:
Lg = 'NA'
try:
Pos = Pos_find[0].getText()
except:
Pos = 'NA'
try:
G = G_find[0].getText()
except:
G = 'NA'
try:
GS = GS_find[0].getText()
except:
GS = 'NA'
try:
MP = MP_find[0].getText()
except:
MP = 'NA'
try:
FG = FG_find[0].getText()
except:
FG = 'NA'
try:
FGA = FGA_find[0].getText()
except:
FGA = 'NA'
try:
FGP = FGP_find[0].getText()
except:
FGP = 'NA'
try:
P3 = P3_find[0].getText()
except:
P3 = 'NA'
try:
PA3 = PA3_find[0].getText()
except:
PA3 = 'NA'
try:
PP3 = PP3_find[0].getText()
except:
PP3 = 'NA'
try:
P2 = P2_find[0].getText()
except:
P2 = 'NA'
try:
PA2 = PA2_find[0].getText()
except:
PA2 = 'NA'
try:
PP2 = PP2_find[0].getText()
except:
PP2 = 'NA'
try:
eFGP = eFGP_find[0].getText()
except:
eFGP = 'NA'
try:
FT = FT_find[0].getText()
except:
FT = 'NA'
try:
FTA = FTA_find[0].getText()
except:
FTA = 'NA'
try:
FTP = FTP_find[0].getText()
except:
FTP = 'NA'
try:
ORB = ORB_find[0].getText()
except:
ORB = 'NA'
try:
DRB = DRB_find[0].getText()
except:
DRB = 'NA'
try:
TRB = RRB_find[0].getText()
except:
TRB = 'NA'
try:
AST = AST_find[0].getText()
except:
AST = 'NA'
rows.append([Name, Weight, Height, Season,
Age, Tm, Lg, Pos, G, GS, MP, FG, FGA,
FGP, P3, PA3, PP3, P2, PA2, PP2, eFGP, FT,
FTA , FTP, ORB, DRB, TRB, AST, STL, BLK, TOV, PF, PTS])
with open('player_zaid.csv','w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerows(rows)
你有很多段代码做基本相同的事情,这违反了Don't Repeat Yourself (DRY)原则。避免重复的通常方法是编写一个函数来隐藏重复。
def get_text_or_NA(container):
try:
result = container[0].getText()
except:
result = 'NA'
return result
那么你的基本代码是
Age = get_text_or_NA(Age_find)
Tm = get_text_or_NA(Tm_find)
Lg = get_text_or_NA(Lg_find)
等等。
您可以使用类似的方法来删除代码中的其他重复项——我会把这些留给您。正如@roganjosh 的评论所述,你真的不应该在没有例外的情况下使用 except:
。你的方式只是隐藏了所有问题。更加具体,只隐藏您期望的异常,这样可以在更高级别捕获意外的异常。
我有一个工作代码,但发现有许多 try/except 块来处理异常非常低效。有一个更好的方法吗?
下面粘贴了我目前使用的代码。我应该做一个自定义函数还是 for 循环?如何创建一个?
由于要求,代码已被缩短...
rows = []
rows.append(['Name','Weight', 'Height', 'Season', 'Age', 'Tm', 'Lg', 'Pos', 'G', 'GS', 'MP', 'FG', 'FGA' , 'FGP' , 'P3' , 'PA3' , 'PP3' , 'P2' , 'PA2', 'PP2', 'eFGP' , 'FT', 'FTA' , 'FTP', 'ORB', 'DRB' , 'TRB', 'AST' , 'STL', 'BLK', 'TOV', 'PF' , 'PTS'])
for result in results[1:len(results)]:
Name = soup.find(name="h1", attrs={"itemprop":"name"}).text.strip()
Weight = soup.find(name="span", attrs={"itemprop":"weight"}).text.strip()
Height = soup.find(name="span", attrs={"itemprop":"height"}).text.strip()
# find all columns per result
# data = result.find_all('td')
try:
season = result.find_all('a')[0]
season = season.getText()
except:
season = 'NA'
# check that columns have data
# if len(data) == 0:
# continue
Season = season
Age_find = result.find_all('td', attrs={'data-stat': 'age'})
Tm_find = result.find_all('td', attrs={'data-stat': 'team_id'})
Lg_find = result.find_all('td', attrs={'data-stat': 'lg_id'})
Pos_find = result.find_all('td', attrs={'data-stat': 'pos'})
G_find = result.find_all('td', attrs={'data-stat': 'g'})
GS_find = result.find_all('td', attrs={'data-stat': 'gs'})
MP_find = result.find_all('td', attrs={'data-stat': 'mp_per_g'})
FG_find = result.find_all('td', attrs={'data-stat': 'fg_per_g'})
FGA_find = result.find_all('td', attrs={'data-stat': 'fga_per_g'})
FGP_find = result.find_all('td', attrs={'data-stat': 'fg_pct'})
P3_find = result.find_all('td', attrs={'data-stat': 'fg3_per_g'})
PA3_find = result.find_all('td', attrs={'data-stat': 'fg3a_per_g'})
PP3_find = result.find_all('td', attrs={'data-stat': 'fg3_pct'})
P2_find = result.find_all('td', attrs={'data-stat': 'fg2_per_g'})
PA2_find = result.find_all('td', attrs={'data-stat': 'fg2a_per_g'})
PP2_find = result.find_all('td', attrs={'data-stat': 'fg2_pct'})
eFGP_find = result.find_all('td', attrs={'data-stat': 'efg_pct'})
FT_find = result.find_all('td', attrs={'data-stat': 'ft_per_g'})
FTA_find = result.find_all('td', attrs={'data-stat': 'fta_per_g'})
FTP_find = result.find_all('td', attrs={'data-stat': 'ft_pct'})
ORB_find = result.find_all('td', attrs={'data-stat': 'orb_per_g'})
DRB_find = result.find_all('td', attrs={'data-stat': 'drb_per_g'})
TRB_find = result.find_all('td', attrs={'data-stat': 'trb_per_g'})
AST_find = result.find_all('td', attrs={'data-stat': 'ast_per_g'})
STL_find = result.find_all('td', attrs={'data-stat': 'stl_per_g'})
BLK_find = result.find_all('td', attrs={'data-stat': 'blk_per_g'})
TOV_find = result.find_all('td', attrs={'data-stat': 'tov_per_g'})
PF_find = result.find_all('td', attrs={'data-stat': 'pf_per_g'})
PTS_find = result.find_all('td', attrs={'data-stat': 'pts_per_g'})
try:
Age = Age_find[0].getText()
except:
Age = 'NA'
try:
Tm = Tm_find[0].getText()
except:
Tm = 'NA'
try:
Lg = Lg_find[0].getText()
except:
Lg = 'NA'
try:
Pos = Pos_find[0].getText()
except:
Pos = 'NA'
try:
G = G_find[0].getText()
except:
G = 'NA'
try:
GS = GS_find[0].getText()
except:
GS = 'NA'
try:
MP = MP_find[0].getText()
except:
MP = 'NA'
try:
FG = FG_find[0].getText()
except:
FG = 'NA'
try:
FGA = FGA_find[0].getText()
except:
FGA = 'NA'
try:
FGP = FGP_find[0].getText()
except:
FGP = 'NA'
try:
P3 = P3_find[0].getText()
except:
P3 = 'NA'
try:
PA3 = PA3_find[0].getText()
except:
PA3 = 'NA'
try:
PP3 = PP3_find[0].getText()
except:
PP3 = 'NA'
try:
P2 = P2_find[0].getText()
except:
P2 = 'NA'
try:
PA2 = PA2_find[0].getText()
except:
PA2 = 'NA'
try:
PP2 = PP2_find[0].getText()
except:
PP2 = 'NA'
try:
eFGP = eFGP_find[0].getText()
except:
eFGP = 'NA'
try:
FT = FT_find[0].getText()
except:
FT = 'NA'
try:
FTA = FTA_find[0].getText()
except:
FTA = 'NA'
try:
FTP = FTP_find[0].getText()
except:
FTP = 'NA'
try:
ORB = ORB_find[0].getText()
except:
ORB = 'NA'
try:
DRB = DRB_find[0].getText()
except:
DRB = 'NA'
try:
TRB = RRB_find[0].getText()
except:
TRB = 'NA'
try:
AST = AST_find[0].getText()
except:
AST = 'NA'
rows.append([Name, Weight, Height, Season,
Age, Tm, Lg, Pos, G, GS, MP, FG, FGA,
FGP, P3, PA3, PP3, P2, PA2, PP2, eFGP, FT,
FTA , FTP, ORB, DRB, TRB, AST, STL, BLK, TOV, PF, PTS])
with open('player_zaid.csv','w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerows(rows)
你有很多段代码做基本相同的事情,这违反了Don't Repeat Yourself (DRY)原则。避免重复的通常方法是编写一个函数来隐藏重复。
def get_text_or_NA(container):
try:
result = container[0].getText()
except:
result = 'NA'
return result
那么你的基本代码是
Age = get_text_or_NA(Age_find)
Tm = get_text_or_NA(Tm_find)
Lg = get_text_or_NA(Lg_find)
等等。
您可以使用类似的方法来删除代码中的其他重复项——我会把这些留给您。正如@roganjosh 的评论所述,你真的不应该在没有例外的情况下使用 except:
。你的方式只是隐藏了所有问题。更加具体,只隐藏您期望的异常,这样可以在更高级别捕获意外的异常。