2016-11-13 8 views
0

まず、文字の壁にごめんなさい。私は可能な限り問題を説明しようとします。条件が満たされるたびにコードブロックを実行する

こんにちは、タイトルから、私は単純なifのステートメントを参照すると思うかもしれませんが、それは真実かもしれません。私はこのプロジェクトについて今日いくつかの質問をしてきましたが、今は別のことをしたいと思います。私はLegends of Legends Apiを使ってボットをやっています。ボットが行うことは、特定のプレーヤーの現在のゲームからいくつかの統計を出力することです。ゲームに不慣れな人には、ランクがあります。ランクは、ボットが作業しているチャットにプリントする統計の1つです。それらの統計は、通常のゲームとは異なり、ランク付けされたゲームからのものであり、ランク付けされたゲームは、これらの統計にカウントされるものです。とにかく;私は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 

未ランクの選手なしで試合を見ている場合を除く)

ありがとうございました! :)あなたはKeyErrorを取得している正確な場所でtry except blockを追加してみてくださいすることができます

答えて

0

、これは、それが存在しない場合は、それが存在しないexceptionをキャッチします、そのキーで値を取得しようとしますあなたは(あなたのケースでは、ランク外プレイヤー)例えば

を望むように、あなたはこのexceptionを扱うことができる - これは

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

、あなたのJSONやあなたの辞書だった場合、あなたはtry exceptブロック等とそれを囲む場合this:

# 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

こんにちは、本当に必要なのは試しでした...ブロックを除いて、私は1つ持っていましたが、それは間違って配置されました。いくつかの微調整の後で、私はそれを働かせました、ありがとう! – Aguxez

関連する問題