2016-11-13 3 views
0

Во-первых, извините за стену с текстом. Я стараюсь объяснить проблему как можно больше.Выполнять блок кода при каждом выполнении условия

Здравствуйте, из названия вы можете подумать, что я имею в виду простой оператор if, и это может быть правдой. Сегодня я задал некоторые вопросы по этому проекту, и теперь хочу сделать что-то еще. Я делаю бота, используя Лигу Легенд Апи. То, что делает бот, - это просто напечатать некоторую статистику из текущей игры данного игрока. Для тех, кто не знаком с игрой, есть ранги. Ранг - одна из характеристик, которую бот печатает в чате, где он работает; эти показатели относятся к ранжированным играм, в отличие от обычных игр, ранжированные игры - это те, которые учитывают эти показатели. Так или иначе; Я получаю данные как json, и каждый раз, когда игрок является Unranked (не ранжированный игрок), я получаю 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 

Все так что я могу запустить бот правильно, потому что каждый раз, когда есть неоцениваемый я получаю сообщение об ошибке, и я просто не могу избежать этого (за исключением матча без игрока без разницы)

Спасибо за любую помощь! :)

ответ

0

Вы можете попробовать добавить try except block в точном месте, где вы получаете KeyError, это будет пытаться получить значение в этом ключе, если он не существует, то он будет ловить exception, что он не существует и вы можете справиться с этим exception, как вы хотите (в вашем случае неранжированного игрок)

, например - если это был ваш JSON или ваш ДИКТ

jsonobj = { 
    "players":[ 
     { 
     "rank":"500", 
     "name":"IAMRANKED" 
     }, 
     { 
     "name":"IAMNOTRANKED" 
     } 
    ] 
} 

затем, если вы окружите его с try except блоком, как это:

# EXAMPLES 
try: 
    print(jsonobj['players'][0]['rank']) #SURROUND YOUR ASSIGNEMENT WITH A TRY CATCH BLOCK 
    print("I have a rank") # WILL PRINT RANK EXISTS 
except KeyError: 
    print("I do not have a rank") 

try: 
    print(jsonobj['players'][1]['rank']) 
    print("I have a rank") 
except KeyError: 
    print("I do not have a rank") # WILL PRINT RANK DOES NOT EXIST 

Надеюсь, это поможет!

+0

Привет @fuhrerguxez если этот или любой ответ решил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http: //meta.stackexchange.com/q/5234/179419), щелкнув галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. –

+0

Здравствуйте, действительно, все, что мне нужно, это попробовать ... кроме блока, у меня был один, но он был помещен неправильно. После некоторой настройки здесь и там я получил работу, спасибо! – Aguxez