【问题标题】:Dealing with one KeyError best practice处理一个 KeyError 最佳实践
【发布时间】:2018-06-08 14:36:22
【问题描述】:

我已缩短脚本和pendulum 的开始日期,以便更快地重现此错误。当开始日期为2016, 4, 2 时,在KeyError 发生之前,我收到了大约 47,661 个返回结果。据我所知,我可以使用try: except 传递KeyError。但是,我不知道在那之后可能出现的任何其他 KeyErrors,而且我似乎只是(因为没有更好的词)“吞下”我的错误。 50,000 次(迄今为止)发生 1 次的最佳做法是什么。

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)

【问题讨论】:

  • “我不知道在那之后出现的任何其他 KeyErrors” - 不,你肯定会,只要你不退出 except 子句中的循环。跨度>
  • 第一点:您没有发布回溯,也没有指定此 KeyError 发生的确切位置(哪一行)。第二点:在您的第一个循环中,try/except 子句太大(try 块中的语句太多)。第三点:您应该至少except 子句中打印出异常(以及相关数据,即日期),以便您了解发生了什么。
  • 第一点错误在脚本中被注释掉。第二点是第一次尝试是跳过没有游戏的日期。第一次尝试对后者没有任何限制
  • @ForceBru 在那之后我将如何继续执行脚本并且仍会提示更多错误
  • @MichaelTJohnson,只需将有问题的行在循环内包装在try/except 子句中,如下所示:try: &lt;might raise something&gt; except KeyError: continue

标签: python python-3.x keyerror


【解决方案1】:

最好的办法是在字典上使用.get 方法。所以,不要使用keys['about'],而是使用keys.get("about", "DEFAULT_VALUE")
因此,如果 key 存在,您将获得该值,否则您将获得默认值,即 get 方法中的第二个参数

【讨论】:

  • 谢谢!这样我可以让他们脱颖而出。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2013-08-25
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多