每次满足条件时运行一段代码

时间:2016-11-13 07:33:32

标签: python json

首先,对不起文字墙。我尽可能多地解释这个问题。

您好,从标题中您可能认为我引用了一个简单的if语句,这可能是真的。我今天对这个项目做了一些问题,现在我想做点别的事。我正在使用英雄联盟Api做机器人。机器人做的只是打印一个特定玩家当前游戏的一些统计数据。对那些不熟悉游戏的人来说,有等级。排名是机器人打印到正在进行的聊天的统计数据之一;这些统计数据来自排名游戏,与普通游戏不同,排名游戏是统计这些统计数据的游戏。无论如何;我将数据作为json获取,并且每次玩家没有排名(未排名的玩家)我从请求获得404并且我想处理404以打印其他内容。现在,这是代码的重要部分:

            ids_seen = set()
            for y in range(0, 10):
                num += 1
                i = r_match['participants'][num]
                e_name = i['summonerName']
                e_id = i['summonerId']
                team_id = i['teamId']
                champ = i['championId']

                r_team = requests.get("https://lan.api.pvp.net/api/lol/lan/v2.5/league/by-summoner/{}/"
                                      "entry?api_key=".format(e_id)).json()

                champ_r = requests.get("https://global.api.pvp.net/api/lol/static-data/lan/v1.2/champion?"
                                       "api_key=").json()

                x = r_team["{}".format(e_id)][0]
                e_tier = x['tier']
                e_div = x['entries'][0]['division']

                for key, value in champ_r['data'].items():
                    c_name = value['name']
                    c_id = value['id']

                    chat_say = """
{} - {} {} - Playing `#{}`""".format(e_name, e_tier, e_div, c_name)

                    if champ == c_id:
#                         if r_team['status']['status_code'] == 404:
#                             unranked_term = (e_name + " - " + "Unranked")
#                             unranked_say = """
# {} - Playing `#{}`""".format(unranked_term, c_name)
#                             yield from bot.send_message(message.channel, unranked_say)

                        # else:
                            if team_id == 100:
                                if not team_id in ids_seen:
                                    yield from bot.send_message(message.channel, "```---Blue team---```")
                                yield from bot.send_message(message.channel, chat_say)

                            elif team_id == 200:
#                                 if r_team['status']['status_code'] == 404:
#                                     unranked_term = (e_name + " - " + "Unranked")
#                                     unranked_say = """
# {} - Playing `#{}`""".format(unranked_term, c_name)
#                                     yield from bot.send_message(message.channel, unranked_say)

                                if not team_id in ids_seen:
                                    yield from bot.send_message(message.channel, "```--- Red team ---```")
                                yield from bot.send_message(message.channel, chat_say)

                ids_seen.add(team_id)

                yield from asyncio.sleep(1)

当我运行此代码时,输​​出是这样的:

Player1 - Rank - Champion that is being played
Player2 - Rank - Champion that is being played
Player3 - Rank - Champion that is being played...

......等等;但是如果它发现像我之前提到的没有排名的玩家那么它会发生KeyError,因为它在json上找不到任何排名数据。所以;我评论了一些我想要实现的行。

此:

#                         if r_team['status']['status_code'] == 404:
#                             unranked_term = (e_name + " - " + "Unranked")
#                             unranked_say = """
# {} - Playing `#{}`""".format(unranked_term, c_name)
#                             yield from bot.send_message(message.channel, unranked_say)

我尝试将其准确放置在原来的位置,然后再次获得KeyError;如果我把它放在这里:

                    if team_id == 100:
                            # <- Right here if I'm not wrong.
                        if not team_id in ids_seen:
                            yield from bot.send_message(message.channel, "```---Blue team---```")
                        yield from bot.send_message(message.channel, chat_say)

我得到了球员和冠军,但每个人的排名都显示为未排名;每个人都没有受到任何影响。问题是,如何将其实现到我的代码中?我不确定我是否正在这样做。

我希望输出类似于:

Player1 - Rank - Champion # If it has ranked information
Player2 - Rank - Champion # Same
Player3 - Unranked - Champion # If the player is unranked

一切都是如此我可以正确地运行机器人,因为每次没有排队我都会收到错误而我无法避免(除了没有没有排名球员的比赛)

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:0)

您可以尝试在获得KeyError的确切位置添加try except block,这将尝试获取该密钥的值,如果它不存在,它将捕获{ {1}}它不存在,您可以按照自己的意愿处理此exception(在您的情况下,未经过排名的玩家)

例如

- 如果这是你的json或你的字典

exception

然后,如果你用这样的jsonobj = { "players":[ { "rank":"500", "name":"IAMRANKED" }, { "name":"IAMNOTRANKED" } ] } 块包围它:

try except

希望这有帮助!