处理一个 KeyError 最佳实践
Dealing with one KeyError best practice
我已经缩短了 pendulum
的脚本和开始日期以更快地重现此错误。当开始日期是 2016, 4, 2
时,我在 KeyError
发生之前获得了大约 47,661 个返回结果。据我所知,我可以使用 try:
except
来传递 KeyError
。但是,我不知道在那之后可能会出现任何其他 KeyErrors,这似乎我只是(因为缺少更好的词)"swallowing" 我的错误。 50,000 分之一(到目前为止)的最佳实践是什么。
import csv
import requests
import datetime
from pprint import pprint
import pendulum
gamepks = set()
start = pendulum.datetime(2016, 5, 18)
end = pendulum.datetime(2016, 10, 2)
period = pendulum.period(start, end)
for dt in period.range('days'):
day = dt.format('DD')
month = dt.format('MM')
year = dt.format('YYYY')
the_date = str(month) + "/" + str(day) + "/" + str(year)
try:
req = requests.get('http://gd.mlb.com/components/game/mlb/year_' + str(year) + '/month_' + str(month) + '/day_' + str(day) + '/miniscoreboard.json') #
get_gameIds = req.json()['data']['games']['game']
for gameId in get_gameIds:
gamepk = gameId['game_pk']
gamepks.add(gamepk)
except(KeyError,TypeError):
pass
for new_pk in sorted(gamepks):
req = requests.get('https://statsapi.mlb.com/api/v1.1/game/' + str(new_pk) + '/feed/live?language=en') # ' + str(gamepk) + ' 530302
at_bat_log = req.json()['liveData']['plays']['allPlays']
# Get Game date
game_data = req.json()['gameData']
gamedate = game_data['datetime']['originalDate']
# GET PARK & TEAMS
teams = game_data['teams']
home_team = teams['home']
park = home_team['abbreviation']
away = teams['away']['abbreviation']
home = home_team['abbreviation']
batter_team = (away,home)
pitcher_team = (home,away)
for keys in at_bat_log:
result = keys['result']
res_type = result['type']
res_event = result['event']
des = result['description']
rbi = result['rbi']
about = keys['about']
topbot = about['halfInning']
if topbot == "bottom":
topbot = "B"
if topbot == "top":
topbot = "T"
# Traceback (most recent call last):
# File "C:/Python36/Projects/Shoretend_for_testing_CODE.py", line 65, in <module>
# inn = about['inning']
# KeyError: 'inning'
inn = about['inning']
inning = str(topbot) + str(inn)
row = [new_pk, inning]
print(row)
最好的办法是对字典使用 .get
方法。所以,不要使用 keys['about']
,而是使用 keys.get("about", "DEFAULT_VALUE")
.
因此,如果键存在,您将获得值,否则您将获得默认值,这是 get 方法中的第二个参数
我已经缩短了 pendulum
的脚本和开始日期以更快地重现此错误。当开始日期是 2016, 4, 2
时,我在 KeyError
发生之前获得了大约 47,661 个返回结果。据我所知,我可以使用 try:
except
来传递 KeyError
。但是,我不知道在那之后可能会出现任何其他 KeyErrors,这似乎我只是(因为缺少更好的词)"swallowing" 我的错误。 50,000 分之一(到目前为止)的最佳实践是什么。
import csv
import requests
import datetime
from pprint import pprint
import pendulum
gamepks = set()
start = pendulum.datetime(2016, 5, 18)
end = pendulum.datetime(2016, 10, 2)
period = pendulum.period(start, end)
for dt in period.range('days'):
day = dt.format('DD')
month = dt.format('MM')
year = dt.format('YYYY')
the_date = str(month) + "/" + str(day) + "/" + str(year)
try:
req = requests.get('http://gd.mlb.com/components/game/mlb/year_' + str(year) + '/month_' + str(month) + '/day_' + str(day) + '/miniscoreboard.json') #
get_gameIds = req.json()['data']['games']['game']
for gameId in get_gameIds:
gamepk = gameId['game_pk']
gamepks.add(gamepk)
except(KeyError,TypeError):
pass
for new_pk in sorted(gamepks):
req = requests.get('https://statsapi.mlb.com/api/v1.1/game/' + str(new_pk) + '/feed/live?language=en') # ' + str(gamepk) + ' 530302
at_bat_log = req.json()['liveData']['plays']['allPlays']
# Get Game date
game_data = req.json()['gameData']
gamedate = game_data['datetime']['originalDate']
# GET PARK & TEAMS
teams = game_data['teams']
home_team = teams['home']
park = home_team['abbreviation']
away = teams['away']['abbreviation']
home = home_team['abbreviation']
batter_team = (away,home)
pitcher_team = (home,away)
for keys in at_bat_log:
result = keys['result']
res_type = result['type']
res_event = result['event']
des = result['description']
rbi = result['rbi']
about = keys['about']
topbot = about['halfInning']
if topbot == "bottom":
topbot = "B"
if topbot == "top":
topbot = "T"
# Traceback (most recent call last):
# File "C:/Python36/Projects/Shoretend_for_testing_CODE.py", line 65, in <module>
# inn = about['inning']
# KeyError: 'inning'
inn = about['inning']
inning = str(topbot) + str(inn)
row = [new_pk, inning]
print(row)
最好的办法是对字典使用 .get
方法。所以,不要使用 keys['about']
,而是使用 keys.get("about", "DEFAULT_VALUE")
.
因此,如果键存在,您将获得值,否则您将获得默认值,这是 get 方法中的第二个参数